一、題目描述
給定乙個字串 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 ...