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