給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: 「babad」
輸出: 「bab」
注意: 「aba」 也是乙個有效答案。
示例 2:
輸入: 「cbbd」
輸出: 「bb」
解決方法1:反轉法
反轉字串s,獲得反轉後的字串s1,獲取反轉後的字串s1與s的最大公有字串。此時最大公有字串不一定是最長回文子串。對子串進行判斷,如果不是回文子串,則繼續判斷下乙個回文子串。
該方法比較直接,但是有點繁瑣。以下使用動態規劃解決。
解決方法2:暴力法(動態規劃優化基礎)
獲取所有子串,對每乙個子串判斷是否是回文。
時間複雜度:o(n3),空間複雜度o(1)
解決方法3:動態回歸1(最長回文子串的子串也為回文子串)
逐步選取回文中心,再從中心逐步增加至當前最長回文子串,與當前最長回文子串比較,如果更長,則作為當前最長回文子串。
遞迴公式:
p (i
,j)=
\quad s_i,...,s_j,為回文子串} \\ \quad s_i,...,s_j,不為回文子串}\end\right.
p(i,j)
= s_==s_\right)
p(i,j)
=(p(
i+1,
j−1)
and si
==s
j)時間複雜度:o(n2),空間複雜度o(1)
class solution
}return s.substring(start,end+1);
}private int expandaroundcenter(string s,int left,int right){
int l=left;
int r=right;
while(l>=0 && r備註:解決動態規劃問題只需考慮暴力法以及通過遞迴公式簡化計算的方法,不需要考慮解決方法4的情況。
解決方法4:動態回歸2(manacher 演算法)
第一步:字母之間新增『#』,統一奇數偶數字母的情況。
第二步:順序遍歷字母,利用已計算出的最長子串簡化計算。
時間複雜度o(n),空間複雜度o(n)。
5 最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 方法1 用馬拉車演算法 字串動態規劃 來求最長回文子串時間複雜度可以達到o n 但是部落格裡面有個小失誤 這個id應該不是最大回文...
5 最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb class solution def longestpalindrome self,s k len s olist...
5 最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 這道題比較船艇的應該是dp求法,但鄙人的dp特別特別的差勁。所以我選用中心擴充套件演算法,掃一遍所有節點,把被掃...