leetcode5 最長回文子串 python

2021-08-21 19:48:34 字數 2766 閱讀 7397

題目:

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。

思路:

參考了官方答案 寫了下面幾種答案

1. 中心擴充套件方法

思路:掃一遍字串s,對於回文子串長為奇數的情況,求s[i]為軸對稱中心的回文子串最長值;回文子串長偶數的情況,求s[i]s[i+i] 為中心的最長值。最後求最長。時間複雜度o(n^2),因為掃一遍o(n),中心擴充套件也是o(n)。注意陣列越界和下標。

參考:

class solution:

def longestpalindrome(self, s):

""":type s: str

:rtype: str

"""start = end = 0

for i in range(len(s)):

len1 = self.centerexpand(s, i, i) #回文串長度為奇數,aba

len2 = self.centerexpand(s, i, i+1) #回文串長度為偶數,abba

maxlen = max(len1, len2)

if maxlen > end - start + 1:

start = i - (maxlen - 1)//2

end = i + maxlen//2

return s[start: end+1]

def centerexpand(self,s,l,r):

while l >= 0 and r < len(s) and s[l] == s[r]:

l -= 1

r += 1

return r - l - 1

2.manacher

思路:

需要注意下面的各種情況都是為了找rl[i]可能的最大起始點,這樣就不用從0開始試了。

1)i(1) rl[j] 比較短的情況:(j是i關於pos的對稱點)rl[i] 從rl[j] 開始

(2)rl[j] 比較長的情況:rl[i] 從maxright - i 開始

rl[i] 從0開始。

class solution:

def longestpalindrome(self,s):

""":type s: str

:rtype: str

"""s = '#'+'#'.join(s)+'#' #例如'#a#b#a#'

pos = maxright = 0

rl = [0]*len(s) #rl是回文串半徑,如回文串長3,rl=1,回文串長5,rl=2

maxcenter = 0 #記錄最長回文中心序號

for i in range(len(s)):

if i=0 and i+rl[i]+1maxright: #更新maxright和i

maxright = rl[i] + i

pos = i

if rl[i] > rl[maxcenter]: #更新maxcenter

maxcenter = i

return s[maxcenter-rl[maxcenter]:maxcenter+rl[maxcenter]+1].replace('#','')

3. 正反字串的最長公共子串

思路:官方答案的思路1。

具體實現上,求最長公共子串用動態規劃參考 

如果是第一次看到,注意c[i][j]是(len+1)*(len+1)大小的,動態規劃一般更新每個狀態c[i][j]後才會得到答案。

像官網說的,為了區分字串中子串非回文反向副本如abacfgcaba,要驗證公共子串的索引。

class solution:

def longestpalindrome(self,s):

""":type s: str

:rtype: str

"""lens = len(s)

maxlen = 0

maxindex = 0

s_rev = s[::-1]

c = [[0]*(lens+1) for i in range(lens+1)]

for i in range(1,lens+1):

for j in range(1,lens+1):

if s[i-1] == s_rev[j-1]:

c[i][j] = c[i-1][j-1]+1

if c[i][j]>maxlen and i+j-c[i][j] == lens: #驗證索引

maxlen = c[i][j]

maxindex = i

else:

c[i][j] = 0

return s[maxindex-maxlen:maxindex]

(上面這個答案...第一次提交94/103,超時。再試過了,看來還是用時比較長的方法)

LeetCode5最長回文子串

給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 動態規劃來做,每個回文字串的子字串也是回文字串,即string是回文字串那麼它的string.substring 1,lenth ...

LeetCode 5 最長回文子串

問題描述 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解決方案 中心擴充套件演算法 事實上,只需使用恆定的空間,我們就可以在 o n 2 的時間內解決這個問題...

leetcode5 最長回文子串

遞推式 1 一般 s i 1 s j 1 and j i and j i len s i 1,j 1 2 初始化dp矩陣對角線的值為 true,相鄰兩個元素相等時dp i i 1 為true 初始化回文串起始位置和長度。def longestpalindrome s n len s if s ret...