5 最長回文子串 動態規劃)

2021-10-11 16:49:14 字數 1448 閱讀 3494

一、題目描述

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

示例 1:

輸入: 「babad」

輸出: 「bab」

注意: 「aba」 也是乙個有效答案。

示例 2:

輸入: 「cbbd」

輸出: 「bb」

二、題解

方法一:動態規劃

dp[i][j]表示從位置i到位置j的子串是否為回文串

如果s[i]==s[j],那麼如果 dp[i+1] [j-1]是回文串,那麼dp[i][j]則為回文串

否則,一定不是回文串

狀態轉移方程可寫為:

邊界條件為長度為1的回文串和長度為2的回文串。

注意:在狀態轉移方程中,我們是從長度較短的字串向長度較長的字串進行轉移的,因此一定要注意動態規劃的迴圈順序。

class

solution

}//遍歷可能的回文串的長度,從3到主串的長度

for(

int l=

3;l<=len;l++)}

}return str;

}}

時間複雜度:o(n

2)

o(n^2)

o(n2

)空間複雜度:o(n

2)

o(n^2)

o(n2

)優化**,使其更加簡潔:

class

solution

else

if(l==2)

else

if(dp[i]

[j]==

1&&str.

length()

str = s.

substring

(i,i+l);}

}return str;

}}

方法二:中心擴充套件演算法

所有的狀態在轉移的時候的可能性都是唯一的。也就是說,我們可以從每一種邊界情況開始「擴充套件」,也可以得出所有的狀態對應的答案。

「邊界情況」對應的子串實際上就是我們「擴充套件」出的回文串的「回文中心」。方法二的本質即為:我們列舉所有的「回文中心」並嘗試「擴充套件」,直到無法擴充套件為止,此時的回文串長度即為此「回文中心」下的最長回文串長度。我們對所有的長度求出最大值,即可得到最終的答案。

class

solution

}return s.

substr

(left,right-left+1)

;}intexpandaroundcenter

(string s,

int left,

int right)

return right - left -1;}};

5 最長回文子串 動態規劃

題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 方法1 中心擴散 主要思路 1 遍歷字串的每乙個位置,以該位置作為基點,向兩端進行擴充套件,...

LeetCode 動態規劃 5 最長回文子串

原題連線 class solution int len s.length if len 1 if len 1 len 3 s.charat 0 s.charat len 1 狀態陣列定義 dp 游標位置i j ij包含的部分是否是回文字串 boolean dp newboolean len len ...

動態規劃 最長回文子串

動態規劃 最長回文子串 題目描述 給出乙個字串s,求s的最長回文子串的長度 樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。動態規劃思想 令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不是為0。這樣根據s i 是否等於s j ...