๋ฆฌํธ์ฝ๋ 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