給你一個字符串 s
,找到 s
中最長的迴文子串。
如果字符串的反序與原始字符串相同,則該字符串稱爲迴文字符串。
示例 1:
輸入:s = "babad"
輸出:"bab"
解釋:"aba" 同樣是符合題意的答案。
示例 2:
輸入:s = "cbbd"
輸出:"bb"
提示:
1 <= s.length <= 1000
s
僅由數字和英文字母組成
這題常規思路是用動規,如果一個迴文串前後相鄰的兩字符相同,那麼就可以擴張成一個新迴文串。邊界條件就是子串的長度爲1或2,長爲1的子串自然是迴文串,長爲2若兩個字符相同那麼也是迴文串。換個角度我們也可以從邊界條件外推,也就是中心擴展法。
class Solution:
def longestPalindrome(self, s: str) -> str:
# dp(i,j)表示s[i..j]是否是迴文喘
# dp[i,i] = 1
# dp(i,i+1) = 1 when s[i]==s[i+1]
# dp(i,j) = 1 when dp(i+1,j-1)==1 and s[i]==s[j]
# 從邊界條件向外擴展
def expand(s, l, r):
while l >= 0 and r < len(s) and s[l] == s[r]:
l -= 1
r += 1
return l+1, r-1
l, r = 0, 0
for i in range(len(s)):
l1, r1 = expand(s, i, i) # 邊界條件 長度爲1的子串
l2, r2 = expand(s, i, i+1) # 邊界條件 長度爲2的子串
if (r1-l1) > (r-l):
l, r = (l1, r1)
if (r2-l2) > (r-l):
l, r = (l2, r2)
return s[l: r+1]