給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
1,擴展中心的方法
考慮到迴文子串可能是偶數或奇數,那展開的中心就存在兩種可能,1,某個字符展開,2,兩個字符之間展開。這樣中心共有n+(n-1)個。
ps::
思路理解混亂,不清晰時,自己在編譯器中逐句執行,助於自己的更好理解,這個方法真的很棒,反正幫助我節省不少時間透徹理解每個程序邏輯。
//計算以left和right爲中心的迴文串長度
int expendaroundcenter(string& s, int left, int right){
int L = left;
int R = right;
while (L >= 0 && R < s.size() && s[R] == s[L]){
L--;
R++;
}
return R - L - 1;
}
//找所有迴文串中最長的子迴文串
string longestPalindrome(string s) {
int len = s.size();
if (len == 0 || len == 1)
return s;
int start = 0;//記錄迴文子串起始位置
int end = 0;//記錄迴文子串終止位置
int mlen = 0;//記錄最大回文子串的長度
for (int i = 0;i < len;i++){
int len1 = expendaroundcenter(s, i, i);//一個元素爲中心
int len2 = expendaroundcenter(s, i, i + 1);//兩個元素爲中心
mlen = max(max(len1, len2), mlen);
if (mlen > end - start + 1){//如果當前的子迴文字符串小於前者,這就不需要繼續計算了。
start = i - (mlen - 1) / 2;
end = i + mlen / 2;
}**這裏的字符串長度計算,很贊,不知道大神們怎麼想到的,後續繼續思想該問題**
}
return s.substr(start, mlen);
//該函數的意思是獲取從start開始長度爲mlen長度的字符串
}
int main() {
string s = "abasabawe";
longestPalindrome(s);
return 0;
}