演算法 最長回文子串 二層動態規劃

2021-10-01 03:51:36 字數 2992 閱讀 2574

這是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**:

1

class

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,不...