這是leetcode上的一道演算法題
對的就是這道題,,困擾了我整整一上午,, 一直也沒考慮用動態規劃做,, 最終用動態規劃把他解決了!
回文串: 正過來和倒過來長的一樣, 比如 理總理, 席主席。。。
思想是這樣的:
用 dp[i][j] 表示 字串s的子串s[i:j] 是不是回文串 0表示不是 1表示是
當 i == j 的時候 dp[i][j] 都是1
(意思是s[1:1] s[2:2] 就是乙個字元, 字元自己算是個回文子串)
當 i == j-1 的時候,如果 s[i] == s[j] 那dp[i][j] =1 否則為0
(倆字元,這倆是一樣的就是回文字元 否則就不是)
其他情況,當 i < j-1 的時候,
如果 dp[i+1][j-1]==1 並且 s[i] == s[j] 的時候 dp[i][i] 就是1
(s[j] 和 s[j] 中間 不包含他倆,原來就是回文的, 他倆還是乙個字元,, 那算上這倆也是回文)
否則 dp[i][j] 都是0
(1 s[i]和s[j]中間不包含他倆, 原來不是回文,,那算上他倆也不是回文。
2 如果他倆中間本來是回文 他倆不是乙個字元,那算上他倆之後就不是回文)
這樣的方式 初始化二維陣列, 先把對角線填充上, 然後再把 對角線上一層(兩個相鄰元素是否相等) 填充上,
然後斜著一層一層填充表就可以。
為了避免重新查表得到最長子串, 可以在填充過程,記錄當前最長的子串長度,起始index和結束index
我的python**:
1class
solution:
2def
longestpalindrome(self, s):
3"""
4:type s: str
5:rtype: str
6"""
7 length = len(s) #
字串長度
8 max_length = 1 #
動態規劃過程中記錄最長回文串長度 預設1是乙個字元的情況
9 start = 0 #
最長回文子串的開始位置 預設一開始s[0]自己是乙個回文子串
10 end = 0 #
回文子串的階數字置11#
初始化乙個 s長度的二維陣列 記錄dp過程
12 record = [[0 for i in range(length)] for _ in
range(length)]13#
record[i][j] 代表 s[i:j] 是不是回文子串
14for i in
range(length):15#
對角線全填充1 代表 乙個字元是回文子串
16 record[i][i] = 117#
相鄰兩個字元如果相同 就記錄1 否則記錄0
18if i >= 1:
19if s[i] == s[i-1]:
20 record[i-1][i] = 1
21 max_length = 2
22 start = i-1
23 end =i
24else
:25 record[i-1][i] =026#
前面兩步驟把i j 相差0 和相差1 的情況都在表裡填充上了27#
下面 改用left當作起始位置 right當作結束位置i和j28#
用i代表left和start的間隔 從2開始到length-1為止29#
用j從1到length-i30#
下面開始填充斜對角線
31for i in range(2, length):
32for j in range(length -i):
33 left =j
34 right = j +i35#
如果 s[left+1: right-1] 是回文串 並且 這兩個位置字元相同 則s[left:right]也是回文的 否則不是
36if record[left+1][right-1] == 1 and s[left] ==s[right]:
37 record[left][right] = 138#
如果發現當前回文串比之前發現的長度長 則更新長度 開始位置和結束位置
39if right - left + 1 >max_length:
40 start =left
41 end =right
42 max_length = right - left + 1
43else
:44 record[left][right] =045#
返回發現的最長回文串
46return s[start: end+1]
4748
49if
__name__ == '
__main__':
50 s =solution()
51 res = s.longestpalindrome("
abbajlhkh")
52print(res)
動態規劃 最長回文子串
動態規劃 最長回文子串 題目描述 給出乙個字串s,求s的最長回文子串的長度 樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。動態規劃思想 令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不是為0。這樣根據s i 是否等於s j ...
動態規劃 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 本題有很多種解法,最簡單的暴力求解,但是會超時。下面分別說明動態規劃法和中心擴散法。解法一 動態規劃法...
最長回文子串 動態規劃
給出乙個字串s,求s的最長回文子串的長度。樣例輸入 patzjujztaccbcc 輸出 9 尋找二維動態規劃表示式dp i j 如果直接用dp i j 表示子符串從s i 到s j 的最長回文子串長度無法得出遞推表示式。令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不...