5. 最长回文子串

49 阅读1分钟

中心扩展算法
for(int j = 0; j <= 1; j++) {
这个循环只有两次,j = 0,j = 1,分别处理aba型和abba型
并且注意while循环结束后,left和right在原本的位置进一步移动了,需要回到原位

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if(n <= 1) {
            return s;
        }
        int maxlen = 0;
        int start = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j <= 1; j++) {
                int left = i;
                // j = 0为 aba情况
                // j = 1为 baab情况
                // 都要考虑
                int right = i + j;
                // 注意这里的短路原则,当前面条件不满足之后,后面的的语句就不会再判断了,防止数组越界!
                // 必须把left和right边界条件放在前面判断!
                while(left >= 0 && right <= n - 1 && s[left] == s[right]) {
                    left--;
                    right++;
                }
                // 原本应该是right - left + 1
                // left多移动了1步,right也是,-2得到结果
                int len = right - left - 1;
                if(len > maxlen) {
                    maxlen = len;
                    // 和上面同理
                    start = left + 1;
                }
            }
        }
        return s.substr(start, maxlen);

    }
};

小小的修改 循环退出后left++ right--

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if(n <= 1) {
            return s;
        }
        int maxlen = 0;
        int start = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j <= 1; j++) {
                int left = i;
                // j = 0为 aba情况
                // j = 1为 baab情况
                // 都要考虑
                int right = i + j;
                while(left >= 0 && right <= n - 1 && s[left] == s[right]) {
                    left--;
                    right++;
                }
                left++;
                right--;
                int len = right - left + 1;
                if(len > maxlen) {
                    maxlen = len;
                    start = left;
                }
            }
        }
        return s.substr(start, maxlen);

    }
};

2025/5/5进行复盘,完整的代码(可直接编译)

#include <iostream>
#include <string>
#include <unordered_set>
#include <algorithm>

int substrMaxlen(std::string s) {
    std::unordered_set<char> mySet;
    int n = s.size();
    int maxlen = 0;
    int left = 0;
    for(int right = 0; right < n; right++) {
        while(mySet.find(s[right]) != mySet.end()) {
            mySet.erase(s[left]);
            left++;
        }
        mySet.insert(s[right]);
        maxlen = std::max(maxlen, right - left + 1);
    }
    return maxlen;
}

int main() {
    std::string s;
    std::cout << "input sring" << std::endl;
    std::cin >> s;
    std::cout << substrMaxlen(s) << std::endl;
}