問題の背景
アンチリードとリード文字列で正のパリンドロームシーケンスは同じです。たとえばxyx
、xyyx
問題文字列sが与えられた場合、sは、最長のサブストリングパリンドローム
'xxyxx'であるs = 'asdfxxyxxhjkl'として最長のサブストリングパリンドロミックを検索します。
アイデア
真ん中から始めて、両側に広げます
栗をあげる
如 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の場合、見つかった部分文字列が最も長く、結果が返されます。後で他の部分文字列が見つかった場合は、の長さを比較する必要があります。 2つを選択し、最大のリターンを選択します。
今言ったのは、回文の長さが奇数の場合です。「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の場合、見つかった部分文字列が最も長く、結果が返されます。後で他の部分文字列が見つかった場合は、の長さを比較する必要があります。 2つを選択し、最大のリターンを選択します。
Roryは上記で大したことについて話しましたが、理解を助けるために、コードは次のように実装されています。
コード
# 找s中的最长回文子串
def longestPalindrome(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为中心的最长回文子串
def palindrome(s,l,r):
while l >= 0 and r<len(s) and s[l] == s[r]:
l -= 1
r += 1
return s[l+1:r]
print(longestPalindrome("aaacdxxyxxcaa"))
# 最后结果当然是
# xxyxx