最長回文子串

2021-10-05 02:52:47 字數 1565 閱讀 6108

5. 最長回文子串

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

示例 1:

輸入: "babad"

輸出: "bab"

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

示例 2:

輸入: "cbbd"

輸出: "bb"

假設乙個字串s為回文串,在其兩端各加入乙個元素,元素是否相等決定了新構成的字串是否為回文串

dp[i][j] 描述 [i,j] 區間所構成的串是否為回文串

定義狀態轉換

dp[i][j] = dp[i+1][j-1] && s[i] == s[j]

初始化長度為2的回文串

長度為3的回文串

輸出dp[i][j] = true && j - i 最大值時對應的回文串

dp問題

重疊子問題 求解[i.j]區間是否為回文串, 故區間長度為區分父子問題的引數

最優子結構

class

solution

}// 初始化

for(

int i=

2; i< s.

size()

;++i)

}// 初始化長度為3

// cout << res.second << '\t' << res.first << endl;

if(res.first ==-1

)return s.

substr(0

,1);

for(

int r =

3; r < s.

size()

;++r)

}// [i,j]

if(res.second - res.first +

1< r)

break;}

// len = r + 1

return s.

substr

(res.first, res.second-res.first+1)

;}};

時間複雜度 o(n^2)

空間複雜度 o(n^2)

這道題直接用二維dp有些牛刀小用而且時間複雜度不理想

對應長度為奇偶的處理方式相同,初始化不同

以遞迴的方式分別以每個點做鏡心擴張

class

solution

}return s.

substr

(start,mlen)

;//該函式的意思是獲取從start開始長度為mlen長度的字串

}private

:int

expendaroundcenter

(string s,

int left,

int right)

//計算以left和right為中心的回文串長度

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