5. 最長回文子串
給你乙個字串s
,找到s
中最長的回文子串。
示例 1:
輸入:s = "babad"示例 2:輸出:"bab"
解釋:"aba" 同樣是符合題意的答案。
輸入:s = "cbbd"示例 3:輸出:"bb"
輸入:s = "a"示例 4:輸出:"a"
輸入:s = "ac"class solution:輸出:"a"
方法一、剛拿到題,如果要在短時間內快速ac,可以暴力列舉,根據回文子串的定義,列舉所有長度大於等於 2的子串,依次判斷它們是否是回文。**如下
# 暴力匹配(超時)
def longestpalindrome(self, s):
# 特判
size = len(s)
if size < 2:
return s
max_len = 1
res = s[0]
# 列舉所有長度大於等於 2 的子串
for i in range(size - 1):
for j in range(i + 1, size):
if j - i + 1 > max_len and self.__valid(s, i, j):
max_len = j - i + 1
res = s[i:j + 1]
return res
def __valid(self, s, left, right):
# 驗證子串 s[left, right] 是否為回文串
while left < right:
if s[left] != s[right]:
return false
left += 1
right -= 1
return true
如果題目限制了執行時間,暴力列舉的方法顯然會超時。對於乙個子串而言,如果它是回文串,並且長度大於 22,那麼將它首尾的兩個字母去除之後,它仍然是個回文串。根據這樣的思路,我們就可以用動態規劃的方法解決本題。我們用 p(i,j)表示字串 s的第 i到 j 個字母組成的串(下文表示成 s[i:j])是否為回文串。也就是說,只有 s[i+1:j-1]是回文串,並且 s 的第 ii和 j個字母相同時,s[i:j]才會是回文串。上文的所有討論是建立在子串長度大於 2 的前提之上的,我們還需要考慮動態規劃中的邊界條件,即子串的長度為 1或 2。對於長度為 11的子串,它顯然是個回文串;對於長度為 2的子串,只要它的兩個字母相同,它就是乙個回文串。因此我們就可以寫出動態規劃的邊界條件。根據這個思路,我們就可以完成動態規劃了。**如下方法二、動態規劃
class solution:
def longestpalindrome(self, s: str) -> str:
n = len(s)
dp = [[false] * n for _ in range(n)]
ans = ""
# 列舉子串的長度 l+1
for l in range(n):
# 列舉子串的起始位置 i,這樣可以通過 j=i+l 得到子串的結束位置
for i in range(n):
j = i + l
if j >= len(s):
break
if l == 0:
dp[i][j] = true
elif l == 1:
dp[i][j] = (s[i] == s[j])
else:
dp[i][j] = (dp[i + 1][j - 1] and s[i] == s[j])
if dp[i][j] and l + 1 > len(ans):
ans = s[i:j+1]
return ans
最長回文子串 最長回文子串行
1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...
最長回文子串
描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...
最長回文子串
輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...