力扣丢人日记-最长回文子串

最长回文子串
因为是抄马拉车的板子的。。所以开一篇丢人日记记录自己对马拉车的理解
关于马拉车的介绍和相应的博文我想网上应该很多了
为了防止奇偶问题,我们首先要对原字符串做一个预处理,在每个字符后面加上’#’,即
abcdefgh → a#b#c#d#e#f#g#h#
然后在第一个字符前再加上’$#'来防止越界问题
此时,我们需要一个数组P来记录当前字符的回文半径,初始值显然是1
然后需要两个值point与right,来记录当前最长回文子串的中心位置以及该串最右边的位置
然后对于当前更新的点,如果在最长回文子串的范围内,那么我们根据回文串的对称性可以将该点在该回文子串范围内的P值给算出来,见图
力扣丢人日记-最长回文子串_第1张图片
然后对于其他情况只能一步步更新P值了
具体代码:

class Solution {
public:
    string longestPalindrome(string s) {
        string res = "$#";
        for (auto c : s) {
            res += c;
            res += "#";
        }
        vector<int> P(res.size(), 1);
        
        int mid = 0, right = 0;
        int maxlen = 0, maxpoint = 0;
        for (int i = 1; i < res.size(); ++i) {
            P[i] = right > i ? min(P[2 * mid - i], right - i) : 1;
            while (res[i + P[i]] == res[i - P[i]]) ++P[i];
            if (right < i + P[i]) {
                right = P[i] + i;
                mid = i;
            }
            
            if (maxlen < P[i]) {
                maxlen = P[i];
                maxpoint = i;
            }
        }
        
        return s.substr((maxpoint - maxlen) / 2, maxlen - 1);
    }
};

你可能感兴趣的:(leetcode)