516 最長回文子串行

2021-10-05 19:23:09 字數 1768 閱讀 7215

516. 最長回文子串行

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

示例 1:

輸入:

"bbbab"
輸出:

4
乙個可能的最長回文子串行為 「bbbb」。

示例 2:

輸入:

"cbbd"
輸出:

2
乙個可能的最長回文子串行為 「bb」。

狀態定義:dp[i][j] 代表str的區間[i,j]最長的回文子串的長度。

狀態選擇、狀態轉移:

if

str[i]

==str

[j]:

dp[i]

[j]=

max(

2+dp[i+1]

[j-1

], dp[i]

[j-1

], dp[i+1]

[j])

else

: dp =

max(dp[i]

[j-1

], dp[i+1]

[j])

class

solution

:def

longestpalindromesubseq

(self, s:

str)

->

int:

lens =

len(s)

if lens <2:

return lens

dp =[[

0for j in

range

(lens)

]for i in

range

(lens)

]for i in

range

(lens)

: dp[i]

[i]=

1 max_sub_s =

1for i in

range

(lens-2,

-1,-

1): dp[i]

[i+1]=

2if s[i]

== s[i+1]

else

1 max_sub_s_i = dp[i]

[i+1

]for j in

range

(i+2

,lens)

: tmp =

1if s[i]

== s[j]

: tmp =

2+ dp[i+1]

[j-1

] dp[i]

[j]=

max(tmp,dp[i]

[j-1

],dp[i+1]

[j])

max_sub_s_i =

max(max_sub_s_i, dp[i]

[j])

max_sub_s =

max(max_sub_s,max_sub_s_i)

return max_sub_s

通過此題可以聯想到:

1143. 最長公共子串行中狀態定義與狀態選擇的方法。

5. 最長回文子串 中狀態轉移的方式。

516 最長回文子串行

516.最長回文子串行 子串行和子串是不同的,子串行是不連續的序列,而子串是連續的。這個題所求為最長的回文子串行,如果要遍歷的話,時間複雜度為指數級別,肯定是超時的。這種要求為o n 2 的時間複雜度,除了貪心,基本只有dp能做到了,那麼子問題是什麼呢?這樣定義 如果已知區間 i j 中最長的回文子...

516 最長回文子串行

516.最長回文子串行 給定乙個字串 s 找到其中最長的回文子串行,並返回該序列的長度。可以假設 s 的最大長度為 1000 示例 1 輸入 bbbab 輸出 4 解釋 乙個可能的最長回文子串行為 bbbb 示例 2 輸入 cbbd 輸出 2 解釋 乙個可能的最長回文子串行為 bb 剛開始做提的時候...

516 最長回文子串行

給定乙個字串s,找到其中最長的回文子串行。可以假設s的最大長度為1000。示例 1 輸入 bbbab 輸出 4 乙個可能的最長回文子串行為 bbbb 示例 2 輸入 cbbd 輸出 2 乙個可能的最長回文子串行為 bb 解 狀態 f i j 表示 s 的第 i 個字元到第 j 個字元組成的子串中,最...