//中心擴散法,從中間向兩邊擴散。比動態規劃計算量更少。
class solution
int maxlen = 1;
int begin = 0;
char chararray = s.tochararray();
for(int i = 0; i < len - 1; i++)
}return s.substring(begin, begin + maxlen);
}private int expandaroundcenter(char chararray, int left, int right) else
}//回文串的長度是j - i + 1 - 2 = j - i + 1 這個2是i-- 和j++多出來的2
return j - i - 1;
}}題解過程:
b a b a b
0 1 2 3 4
首先 0 0 和 0 1 開始 => 0 0 判斷相等退出,返回 1 - (-1) - 1 = 1 同理 0 1直接退出,返回 0
其次 1 1 和 1 2 開始 => 1 1 判斷相等後擴散 0 2 也相等,返回 3 。同理 1 2返回 0。
其餘都類似
最終得到 bab為最長子串,長度為3。
時間複雜度:o(n2)
空間複雜度:o(n2)
//動態規劃 => 通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。
class solution
int maxlen = 1;
int begin = 0;
//dp[i][j] 表示 s[i..j] 是否是回文串
boolean dp = new boolean[len][len];
//自己對應的乙個字母肯定是回文串
for(int i = 0; i < len; i++)
char chararray = s.tochararray();
//左下角先填 [0 1] [0 2] [1 2] [0 3] [1 3] [2 3] [....] 豎著先填
for(int j = 1; j < len; j++) else else
}//只要 dp[i][j] == true 成立, 就表示字串 s[i .. j] 是回文,此時記錄回文長度和起始位置
if(dp[i][j] && j - i + 1 > maxlen)}}
return s.substring(begin, begin + maxlen);
}}題解過程:
b a b a b
0 1 2 3 4
首先每乙個[i, i]都為true。
0 1 2 3 4
0 t
1 t
2 t
3 t
4 t
對於[0, 1] => [i] != [j], 對於[0, 2] 有 [i] = [j] 且 j - i < 3。其他同理
0 1 2 3 4
0 t f t f
1 t f t f
2 t f t
3 t f
4 t
對於 [0, 4] 則需要用到動態規劃, 利用前面的已知資訊。首先可知[0] = [4], 且[1,3]為t, 故為t。
0 1 2 3 4
0 t f t f t
1 t f t f
2 t f t
3 t f
4 t
左下角為對稱, 最終可得到最大字串。
時間複雜度:o(n2)
空間複雜度:o(n2)
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特別特別的差勁。所以我選用中心擴充套件演算法,掃一遍所有節點,把被掃...