๋ฆฌํธ์ฝ๋ 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'์ธ ์ง์ ํฐ๋ฆฐ๋๋กฌ
์ฌ๋ผ์ด๋ฉ ์๋์ฐ
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๋ณด๋ค ๋ ๊ธด ํฐ๋ฆฐ๋๋กฌ์ด ๋์ค๋ฉด ์ ๋ฐ์ดํธํจ
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""
์ ๋ต ์ฝ๋
# ๊ฐ์ฅ ๊ธด ํ ๋ฆฐ๋๋กฌ ์ : ํฌ ํฌ์ธํธ, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๋ฐฉ์ ์์ฉ
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