題目:
給定乙個字串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...