【題目描述】數組
【方法一:菜雞思路】bash
兩層循環,時間複雜度平方級別。 上代碼app
class Solution:
def longestPalindrome(self, s: str) -> str:
if (len(set(s))==1):return s
max1=0
re=''
for i in range(len(s)):
for j in range(1,len(s)-i):
zheng=s[i:i+j+1]
fan=zheng[::-1]
if(zheng==fan and max1<=len(zheng)):
max1=len(zheng)
re=zheng
if (len(re)==0):return s[0:1]
return re
複製代碼
看這執行效率,簡直了。 ui
【方法二:動態規劃】二維動態規劃問題,用一個數組存i-j可否構成迴文,而後i從尾部向前,j從i+1到尾部,而後當找到了s[i]=s[j]就看看這二者之間的部分是否是迴文串,若是是,則更新迴文長度,不是則繼續。因此仍是兩層循環,複雜度平方級別。spa
class Solution:
def longestPalindrome(self, s: str) -> str:
right=left=0
dp=[]
for i in range(len(s)):
dp.append([False]*len(s))
dp[i][i]=True
i=len(s)-2
while(i>=0):
j=i+1
while(j<len(s)):
dp[i][j]=s[i]==s[j] and (dp[i+1][j-1] or j-i==1)
if(dp[i][j] and right-left<j-i):
right=j
left=i
j+=1
i-=1
return s[left:right+1]
複製代碼
看效果仍是很慢啊: 指針
【方法三:中心擴展法】一層循環,逐個以字符串中的元素爲中心,再用雙指針,向其兩邊擴展,找到以每一個元素爲中心的最長子迴文串,保存最長的起始位置以及長度便可。效率提升了一些。可是時間複雜度處於O(n)與O(n*n)之間,由於每次循環時還須要左右搜索。code
class Solution:
def longestPalindrome(self, s: str) -> str:
if(len(s)<=1):return s
i=minstart=0
maxl=1
while i <len(s):
if(len(s)-i<maxl/2):
break
l=r=i
while(r<len(s)-1 and s[r]==s[r+1]):
r+=1
while(r<len(s)-1 and l>0 and s[l-1]==s[r+1]):
r,l=r+1,l-1
if(r-l+1>=maxl):
minstart,maxl=l,r-l+1
i+=1
return s[minstart:minstart+maxl]
複製代碼