最長回文子串

2021-10-07 11:14:32 字數 2398 閱讀 9052

​ 題目描述

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。

​ 示例

輸入: "babad"

輸出: "bab"

注意: "aba" 也是乙個有效答案。

輸入: "cbbd"

輸出: "bb"

要做這個題,首先要了解什麼是回文子串。

回文子串:正讀和反讀都一樣的字串。比如:levelnoonbd就不是回文串

既然題目中要找出乙個字串的最長回文子串。

那麼可以將問題劃分為三個小問題:(1):找出該字串的所有字串;(2):在所有子串中判斷找出回文串;(3):找出最長的回文子串

class

solution}}

return res;

}// 判斷字串是否是回文串

private

boolean

ispalindrome

(string s)

}return

true;}

}

時間複雜度:o(n^3);空間複雜度:o(1)這種情況極其容易超時

中心擴充套件法是暴力迴圈法的優化。

暴力迴圈法對於每乙個子串都進行了回文串的判斷。回文子串就是正讀和反讀都一樣,那麼我們可以從字串s的每個回文中心位置向兩邊擴充套件,擴充套件的時候來比較字元是否相同。

考慮到字串s的長度不確定,所以我們在回文中心擴充套件的時候應該考慮兩種情況:奇數或者偶數。

class

solution

}return s.

substring

(start, end +1)

;}// 在回文中心進行擴充套件

private

intexpandaroundcenter

(string s,

int left,

int right)

return right - left -1;

}}

時間複雜度:o(n^2);空間複雜度:o(1)

動態規劃的核心就是記住已解決問題的解。

如果乙個回文串去掉首尾兩個字元,那麼得到的新的字串也是乙個回文串

基於此點,我嘗試著寫狀態轉移方程:

p (i

,j)=

p(i+

1,j−

1)∧(

si==

sj

)p(i,j)=p(i+1,j−1)∧(s i==s j)

p(i,j)

=p(i

+1,j

−1)∧

(si=

=sj)

即:當s[i+1,j-1]為回文串且s[i]==s[j]的時候,s[i,j]是回文串

class

solution

char

chars = s.

tochararray()

;// 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)}}

// 4. 返回值

return s.

substring

(begin,begin + maxlen);}

}

時間複雜度:o(n^2);空間複雜度:o(n^2)

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...

最長回文子串

輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...