【LeetCode刷題】-C++—中等—5—最長迴文子串

題目描述:

在這裏插入圖片描述

思路

見代碼註釋

代碼

class Solution {
public:
    string longestPalindrome(string s) {
        //Case1:空的或者只有一個的,就是迴文,直接返回
        if(s.size() == 0 || s.size() == 1) 
            return s;
        //Case2:如果只有兩個相等的元素,也是迴文字符串,直接返回;
        if(s.size() == 2 && s[0] == s[1])
            return s;
        
        //Case3:一般情況
        //--Step1:先初始化變量,
        int start(0), end(0);//start和end記錄迴文子串的起始位置
        int maxLen(0);//maxLen用來記錄迴文子串的長度
        //--Step2:遍歷尋找,【中心拓展法】
        //--在findSameLength中實現
        for(int i=0; i<s.size(); i++){
            int len1 = findSameLength(s, i, i);
            int len2 = findSameLength(s, i, i+1);
            if(maxLen < max(len1, len2)){
                maxLen = max(len1, len2);
                start = i- (maxLen - 1) / 2;
                end = i + maxLen / 2;
            }
        }
        return s.substr(start, end - start +1);
    }
    
    int findSameLength(string &s, int left, int right){
        //如果兩個位置的元素值相等,那就往兩邊擴展
        while(left >= 0 && right < s.size() && s.at(left) == s.at(right)){
            left--, right++;
        }
        //然後返回此時子串的長度,因爲相等的時候已經移動了一步,所以得到的值多1,因此再減掉1
        return right-left-1;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章