(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]