回文串正著讀和反著讀都一樣的字串,如xyx
和xyyx
問題給定乙個字串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...