最長回文子串

2022-06-23 10:51:14 字數 1978 閱讀 3553

5. 最長回文子串

給你乙個字串s,找到s中最長的回文子串。

示例 1:

輸入:s = "babad"

輸出:"bab"

解釋:"aba" 同樣是符合題意的答案。

示例 2:

輸入:s = "cbbd"

輸出:"bb"

示例 3:

輸入:s = "a"

輸出:"a"

示例 4:

輸入:s = "ac"

輸出:"a"

方法一、剛拿到題,如果要在短時間內快速ac,可以暴力列舉,根據回文子串的定義,列舉所有長度大於等於 2的子串,依次判斷它們是否是回文。**如下

class solution:

# 暴力匹配(超時)

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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...