leetcode5--. 最長迴文子串(中心擴散)

給定一個字符串 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章