最長の回文部分文字列を見つける-python

記事のディレクトリ

問題の背景

アンチリードとリード文字列で正のパリンドロームシーケンスは同じです。たとえばxyxxyyx
問題文字列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

おすすめ

転載: blog.csdn.net/weixin_39333120/article/details/112296702