5 最長回文子串(過程分析)

2021-10-09 10:02:51 字數 1907 閱讀 4319

//中心擴散法,從中間向兩邊擴散。比動態規劃計算量更少。

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特別特別的差勁。所以我選用中心擴充套件演算法,掃一遍所有節點,把被掃...