最長回文子串

2022-08-30 15:30:18 字數 1556 閱讀 2931

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

示例 1:

輸入: "babad"

輸出: "bab"

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

示例 2:

輸入: "cbbd"

輸出: "bb"

方法1:暴力法

求乙個字串的最長回文子串,我們可以將以每個字元為首的子串都遍歷一遍,判斷是否為回文,如果是回文,再判斷最大長度的回文子串。

複雜度分析

string longestpalindrome(string &s)

if(tmp1 >= tmp2 && j - i + 1 >maxlen)}}

return

s.substr(start, maxlen);

}

方法2:動態規劃

為了改進暴力法,我們首先觀察如何避免在驗證回文時進行不必要的重複計算。考慮「ababa」 這個示例。如果我們已經知道 「bab」 是回文,那麼很明顯,「ababa」 一定是回文,因為它的左首字母和右尾字母是相同的。

設狀態dp[j][i]表示索引j到索引i的子串是否是回文串。則轉移方程為:

複雜度分析

class

solution

const

int n =s.size();

bool

dp[n][n];

memset(dp,

0, sizeof

(dp));

int maxlen = 1

;

int start = 0

;

for(int i = 0; i < n; ++i)

else

if(dp[j][i] && maxlen < (i - j + 1

)) }}

return

s.substr(start, maxlen);}};

方法3:中心擴充套件法

中心擴充套件就是把給定的字串的每乙個字母當做中心,向兩邊擴充套件,這樣來找最長的子回文串。

複雜度分析

class

solution

else

break

; }

while (r < s.size())

else

break

; }

while (l >= 0 && r < s.length())

else

break

; }

if (right - left < r - l - 2)

}return s.substr(left, right - left + 1);//

返回最終的子串

}};

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

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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...