最長の部分文字列のパリンドローム最長回文サブストリング

(1)暴力を解決するために

class Solution:
    def longestPalindrome(self, s: str) -> str:
        maxlen=0
        result=''
        for i in range(len(s)):
            for j in range(i,len(s)+1):##注意首尾坐标
                if s[i:j]==s[i:j][::-1]:
                    if j-i>maxlen:
                        maxlen=j-i
                        result=s[i:j]
                        #print(result)
        return result    

改善するために(2)動的プログラミング、(1)

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n=len(s)
        arr=[[0]*n for i in range(n)]
        maxlen=0
        result=''

        for j in range(n):
            for i in range(j+1):
                if (j-i<2 or arr[i+1][j-1]==1) and s[i]==s[j]:
                    arr[i][j]=1
                if arr[i][j] and j-i+1>maxlen:
                    maxlen=j-i+1
                    result=s[i:j+1]
        return result

3.パリンドローム配列の中心を見つけ、そして両側に拡張することができます。

文字列が偶数の場合、2つの要素の中心、文字列の長さが奇数の場合私たちは、その後、センターは一要素であり、個別に検討パリティ中心位置を求めています。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n=len(s)
        def expandAroundCenter(left, right):
            L,R=left,right
            while L>=0 and R<len(s) and s[L]==s[R]:
                L+=-1
                R+=1
            return R-L-1

        maxlen=0
        result=''
        for i in range(n):
            len1=expandAroundCenter(i,i)#中间是奇数
            len2=expandAroundCenter(i,i+1)#中间是偶数
            mlen=max(len1,len2)
            if mlen>maxlen:
                maxlen=mlen
                result=s[i-(maxlen-1)//2:i+maxlen//2+1]
                
        return result

4.右側の境界回文配列の最初の決意はi、右境界がi左にテキスト文字列を取得します。仮定iする前に、最長のサブストリングパリンドロームの長さをl、我々は、各チェックする必要があり、i+1文字列の左側の長さをl+2してl+1、文字列をサブストリングは回文ではありません。場合l+2回文配列、文字列の最大長はなるためにl+2のために、l+1同じ理由。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n=len(s)
        if (len(s)<2) or s==s[::-1]:
            return s
        
        maxlen=1
        left=0
        for i in range(1,len(s)):
            s2=s[i-maxlen-1:i+1]   #check L+2
            s1=s[i-maxlen:i+1]  #check L+1
            if i-maxlen-1>=0 and s2==s2[::-1]:
                left=i-maxlen-1
                maxlen+=2
            elif i-maxlen>=0 and s1==s1[::-1]:
                left=i-maxlen
                maxlen+=1
            
        return s[left:left+maxlen]
    

公開された163元の記事 ウォン称賛90 ビュー6256

おすすめ

転載: blog.csdn.net/weixin_45405128/article/details/104433655