查詢最長回文子串 python

2021-10-14 03:51:35 字數 2563 閱讀 8326

回文串正著讀和反著讀都一樣的字串,如xyxxyyx

問題給定乙個字串s,找s中的最長回文子串

如s = 『asdfxxyxxhjkl』,其最長回文子串是』xxyxx』

從中間開始向兩邊擴散

舉個栗子

如 s = 'abcxyxsed',可以看到存在的最長回文子串是'xyx',遍歷字串s

i = 0,s[i] = 'a',向兩邊擴,左邊已是邊界,無法進行,往後遍歷

i = 1,s[i] = 'b',向兩邊擴,s[i-1]!=s[i+1],以s[i]為中心的子串不是回文串,往後遍歷

i = 2,s[i] = 'c',向兩邊擴,s[i-1]!=s[i+1],以s[i]為中心的子串不是回文串,往後遍歷

i = 3,s[i] = 'x',向兩邊擴,s[i-1]!=s[i+1],以s[i]為中心的子串不是回文串,往後遍歷

i = 4,s[i] = 'y',向兩邊擴,s[i-1]=s[i+1],以s[i]為中心的長度為3的串是回文串,繼續往外擴,

可能能找到更長的回文子串,s[i-2]!=s[i+2],沒有找到更長的,現在找到了乙個回文子串,

但是不知道這個串是不是最長的,繼續往後遍歷

i = 5,s[i] = 'x',向兩邊擴,s[i-1]!=s[i+1],以s[i]為中心的子串不是回文串,往後遍歷

……

一直遍歷到最後,都沒有再找到其他的回文子串了,可知i=4時找到的即是最長,返回結果;若是後續又找到了其他的子串,需比較二者的長度大小,選最大的返回。

剛剛說的是回文串長度是奇數的情況,對於回文串長度是偶數的情況,如『abxyyxcd』,再用上述方法就不行了,所以

再舉個栗子

如s = 'abcxyyxsed',可以看到存在的最長回文子串是'xyyx',遍歷字串s

i = 0, j = i+1 = 1,s[i] = 'a' ,s[j] = 'b', s[i] != s[j] ,以s[i],s[j]為中心的子串不是回文串,往後遍歷

i = 1, j = i+1 = 2,s[i] = 'b' ,s[j] = 'c', s[i] != s[j] ,以s[i],s[j]為中心的子串不是回文串,往後遍歷

i = 2, j = i+1 = 3,s[i] = 'c' ,s[j] = 'x', s[i] != s[j] ,以s[i],s[j]為中心的子串不是回文串,往後遍歷

i = 3, j = i+1 = 4,s[i] = 'x' ,s[j] = 'y', s[i] != s[j] ,以s[i],s[j]為中心的子串不是回文串,往後遍歷

i = 4, j = i+1 = 5,s[i] = 'y' ,s[j] = 'y', s[i] = s[j] ,以s[i],s[j]為中心的長度為1的子串是回文串,繼續往外擴,

可能能找到更長的回文子串,s[i-1] = s[j+1],以s[i],s[j]為中心的長度為2的子串是回文串,

繼續往外擴,s[i-2]!=s[j+2],沒有找到更長的,現在找到了乙個回文子串,但是不知道這個串是不是最長的,

繼續往後遍歷

i = 5, j = i+1 = 6,s[i] = 'y' ,s[j] = 'x', s[i] != s[j] ,以s[i],s[j]為中心的子串不是回文串,往後遍歷

……

一直遍歷到最後,都沒有再找到其他的回文子串了,可知i=4時找到的即是最長,返回結果;若是後續又找到了其他的子串,需比較二者的長度大小,選最大的返回。

上面羅里吧嗦講了一大通,只是輔助理解,**實現如下:

# 找s中的最長回文子串

deflongestpalindrome

(s):

res =

""for i in

range

(len

(s))

:# 找以s[i]為中心的最長回文子串

s1 = palindrome(s,i,i)

# 找以s[i],s[i+1]為中心的最長回文子串

s2 = palindrome(s,i,i+1)

# 比較已找到的回文子串的長度,保留最長的

res = res if

len(res)

>

len(s1)

else s1

res = res if

len(res)

>

len(s2)

else s2

return res

# 找s中的以l,r為中心的最長回文子串

defpalindrome

(s,l,r)

:while l >=

0and r<

len(s)

and s[l]

== s[r]

: l -=

1 r +=

1return s[l+

1:r]

print

(longestpalindrome(

"aaacdxxyxxcaa"))

# 最後結果當然是

# xxyxx

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

LeetCode 最長回文子串 Python

題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。一開始寫了暴力搜尋法,結果超時了,就上網找了答案,發現乙個部落格寫的很好,推薦 classsolution object deflongestpalindrome self,s types str rtyp...

leetcode 最長回文子串 python

解題思路 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。輸入 cbbd 輸出 bb 首先說一下我的偽 吧 1.遍歷字串 2.比較遍歷的兩個值是否相等 while迴圈來實現 2.1 介於回文串分為a...