๋ฆฌํŠธ์ฝ”๋“œ LeetCode 5 Longest Palindromic Substring ๋ฌธ์ œ์˜ ํŒŒ์ด์ฌ python ํ’€์ด์ž…๋‹ˆ๋‹ค.

https://leetcode.com/problems/longest-palindromic-substring/description/



๋ฌธ์ œ

Given a stringย s, returnย the longestย palindromicย substringย inย s.


Constraints

  • 1 <= s.length <= 1000
  • sย consist of only digits and English letters.




ํ’€์ด

ํˆฌ ํฌ์ธํŠธ๋ฅผ ํ™œ์šฉํ•œ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ™•์žฅ ํ•จ์ˆ˜ ์„ ์–ธ

# ํˆฌ ํฌ์ธํ„ฐ ํ™•์žฅ ํ•จ์ˆ˜ ์„ ์–ธ
ย  ย  ย  ย  def expand(left: int, right: int) -> str:
ย  ย  ย  ย  ย  ย  while left >= 0 and right < len(s) and s[left] == s[right]:
ย  ย  ย  ย  ย  ย  ย  ย  left -= 1
ย  ย  ย  ย  ย  ย  ย  ย  right += 1
 
ย  ย  ย  ย  ย  ย  return s[left + 1 : right]
ย  ย  

์ฃผ์–ด์ง„ left์™€ right๋ฅผ ๊ธฐ์ค€์œผ๋กœ, ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ํ™•์ธํ•˜๋ฉฐ ์–‘์ชฝ์œผ๋กœ ํ™•์žฅํ•ด ๋‚˜๊ฐ€๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ
    • โ€˜abbaโ€™์—์„œ left=1, right=2์ด๋ฉด โ†’ โ€œbbโ€์—์„œ โ€œabbaโ€๊นŒ์ง€ ํ™•์žฅ ๊ฐ€๋Šฅ
  • left + 1 : right๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ์ด์œ 
    • while ๋ฃจํ”„๊ฐ€ ๋๋‚  ๋•Œ๋Š” ํ•œ ๋ฒˆ ๋” ์ดˆ๊ณผํ•œ ์ƒํƒœ๋ผ, ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ๊ฐ„์„ ์ž˜๋ผ์•ผ ํ•จ
# ์˜ˆ์‹œ
s = "racecar"
expand(3, 3) โ†’ "racecar"  โ† ๊ฐ€์šด๋ฐ๊ฐ€ 'e'์ธ ํ™€์ˆ˜ ํŒฐ๋ฆฐ๋“œ๋กฌ
expand(2, 3) โ†’ "cec"      โ† ๊ฐ€์šด๋ฐ๊ฐ€ 'ce'์ธ ์ง์ˆ˜ ํŒฐ๋ฆฐ๋“œ๋กฌ

### ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ```python result = '' for i in range(0, len(s) - 1): result = max(result, expand(i, i+1), expand(i, i+2), key=len)

- ๊ฐ ๋ฌธ์ž ์œ„์น˜ `i`๋ฅผ ๊ธฐ์ค€์œผ๋กœ
    - `expand(i, i+1)` โ†’ **์ง์ˆ˜ ๊ธธ์ด** ํŒฐ๋ฆฐ๋“œ๋กฌ ์‹œ๋„ (ex: `"abba"`)
    - `expand(i, i+2)` โ†’ **ํ™€์ˆ˜ ๊ธธ์ด** ํŒฐ๋ฆฐ๋“œ๋กฌ ์‹œ๋„ (ex: `"racecar"`)
        - ํ™€์ˆ˜ ๊ธธ์ด ํŒฐ๋ฆฐ๋“œ๋กฌ ์กฐ์‚ฌ๋Š” expand(i, i)๋กœ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Œ. ํ•˜์ง€๋งŒ ์–ด์ฐจํ”ผ ํ•œ ๊ธ€์ž ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์„ธ ๊ธ€์ž ๋ฌธ์ž์—ด๋ถ€ํ„ฐ ์กฐ์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ 
- `max(..., key=len)` โ†’ ์„ธ ํ›„๋ณด ์ค‘์—์„œ **๊ฐ€์žฅ ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ ๋ฌธ์ž์—ด์„ ์„ ํƒ**ํ•ด์„œ `result`์— ์ €์žฅ

#### ์™œ i+1, i+2๋ฅผ ์“ธ๊นŒ?
- ํŒฐ๋ฆฐ๋“œ๋กฌ์€ ์ค‘์‹ฌ์„ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์šฐ ๋Œ€์นญ์ด๊ธฐ ๋•Œ๋ฌธ์—,
    - ์ค‘์‹ฌ์ด **ํ•˜๋‚˜**์ผ ์ˆ˜๋„ ์žˆ๊ณ  (`expand(i, i+2)` โ†’ ํ™€์ˆ˜)
    - ์ค‘์‹ฌ์ด **๋‘ ๊ฐœ**์ผ ์ˆ˜๋„ ์žˆ์Œ (`expand(i, i+1)` โ†’ ์ง์ˆ˜)

๊ทธ๋ž˜์„œ ๋‘˜ ๋‹ค ์‹œ๋„ํ•ด ๋ณด๊ณ , **๋” ๊ธด ์ชฝ์„ ์„ ํƒ**
- `max(...)`๋กœ ํ˜„์žฌ result๋ณด๋‹ค ๋” ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ๋‚˜์˜ค๋ฉด ์—…๋ฐ์ดํŠธํ•จ
<br><br>

### `for i in range(0, len(s) - 1)` ๋ฃจํ”„ ๊ณผ์ •

`for i in range(0, len(s) - 1)`  
โ†’ ๊ฐ ์œ„์น˜์—์„œ `expand(i, i+1)` (์ง์ˆ˜) ์™€ `expand(i, i+2)` (ํ™€์ˆ˜) ์ˆ˜ํ–‰

#### ๐Ÿ”น i = 0
- `expand(0, 1)` โ†’ `b โ‰  a` โ†’ ํŒฐ๋ฆฐ๋“œ๋กฌ X โ†’ return `""`
- `expand(0, 2)` โ†’ `b == b`, ๊ทธ๋‹ค์Œ `a == a` โ†’ ํŒฐ๋ฆฐ๋“œ๋กฌ `"bab"`  
    โ†’ ํ˜„์žฌ result: `"bab"`

#### ๐Ÿ”น i = 1
- `expand(1, 2)` โ†’ `a โ‰  b` โ†’ return `""`
- `expand(1, 3)` โ†’ `a == a`, ๊ทธ๋‹ค์Œ `b == b` โ†’ ํŒฐ๋ฆฐ๋“œ๋กฌ `"aba"`  
    โ†’ ๊ธธ์ด ๊ฐ™์Œ. `"bab"` ๋˜๋Š” `"aba"` ์ค‘ ํ•˜๋‚˜ ์œ ์ง€

#### ๐Ÿ”น i = 2
- `expand(2, 3)` โ†’ `b โ‰  a` โ†’ return `""`
- `expand(2, 4)` โ†’ `b โ‰  d` โ†’ return `""`

#### ๐Ÿ”น i = 3
- `expand(3, 4)` โ†’ `a โ‰  d` โ†’ return `""`
- `expand(3, 5)` โ†’ ๋ฒ”์œ„ ๋ฒ—์–ด๋‚จ โ†’ return `""`

<br>

### ์ •๋‹ต ์ฝ”๋“œ
```python
# ๊ฐ€์žฅ ๊ธด ํŽ ๋ฆฐ๋“œ๋กฌ ์ˆ˜ : ํˆฌ ํฌ์ธํŠธ, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹ ์‘์šฉ

class Solution:
ย  ย  def longestPalindrome(self, s: str) -> str:

ย  ย  ย  ย  # ํˆฌ ํฌ์ธํ„ฐ ํ™•์žฅ ํ•จ์ˆ˜ ์„ ์–ธ
ย  ย  ย  ย  def expand(left: int, right: int) -> str:
ย  ย  ย  ย  ย  ย  while left >= 0 and right < len(s) and s[left] == s[right]:
ย  ย  ย  ย  ย  ย  ย  ย  left -= 1
ย  ย  ย  ย  ย  ย  ย  ย  right += 1

ย  ย  ย  ย  ย  ย  return s[left + 1 : right]

ย  ย  ย  ย  # ๊ธธ์ด๊ฐ€ 1 ์ดํ•˜๊ฑฐ๋‚˜, ๋’ค์ง‘์–ด๋„ ๋˜‘๊ฐ™์€ ๊ทธ ์ž์ฒด๋กœ ํŽ ๋ฆฐ๋“œ๋กฌ์ธ ๊ฒฝ์šฐ
ย  ย  ย  ย  if len(s) < 2 or s == s[::-1]:
ย  ย  ย  ย  ย  ย  return s

ย  ย  ย  ย  result = ''
ย  ย  ย  ย  
ย  ย  ย  ย  # ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์šฐ์ธก ์ด๋™
ย  ย  ย  ย  for i in range(0, len(s)-1):
ย  ย  ย  ย  ย  ย  result = max(result, expand(i, i+1), expand(i, i+2), key=len)

ย  ย  ย  ย  return result