5 最長回文子串

2022-05-17 07:51:38 字數 1193 閱讀 4032

1、動態規劃

首先單個字元就是乙個回文子串,如果兩個字元都相同就是乙個回文子串,三個字元是在乙個字元的左右兩邊加上相同字元而成的回文子串,四個字元是兩個字元左右兩邊加上相同字元形成的回文子串。

不妨以單個字元和雙個字元為初始條件去構造動態方程:

dp[i][i]=1;//單個字元

dp[i][i+1]=1;  (s[i]=s[i+1])

1

class

solution 19}

20for(int l=3;l<=len;l++)//

l表示檢索的子串長度,等於3表示先檢索長度為3的子串

2131}32

}33return s.substr(start,max);//

獲取最長回文子串34}

35 };

view code

2、中心擴充套件法

思路就是回文子串可以從他的中心進行擴充套件,並且只有 2n-1 個這樣的中心(乙個元素為中心的情況有 n 個,兩個元素為中心的情況有 n-1 個)

假如回文的中心為 雙數,例如 abba,那麼可以劃分為 ab bb ba,對於n長度的字串,這樣的劃分有 n-1 種。

假為回文的中心為 單數,例如 abcd, 那麼可以劃分為 a b c d, 對於n長度的字串,這樣的劃分有 n 種。

對於 n 長度的字串,我們其實不知道它的回文串中心倒底是單數還是雙數,所以我們要對這兩種情況都做遍歷,也就是 n+(n-1) = 2n - 1,所以時間複雜度為 o(n)。

當中心確定後,我們要圍繞這個中心來擴充套件回文,那麼最長的回文可能是整個字串,所以時間複雜度為 o(n)。

所以總時間複雜度為 o(n^2)

1

string longestpalindrome(string

s) 2

7int start = 0, end = 0;8

for (int i = 0; i < s.length(); i++)918

}19return s.substr(start, end - start + 1

);20}21

22int expandaroundcenter(string s, int left, int

right)

2330

return r - l - 1

;31 }

view code

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