5. 最长回文子串

用的Manacher

class Solution {
public:
    string init(string s)
    {
        string str = "$";
        int len = s.length();
        for(int i = 0; i < len; i++)
            str += "#", str += s[i];
        str += "#";
        return str;
    }

    string Manacher(string s)
    {
        int p[2010];

        string str = init(s);
        int n = str.length();
        int mx = 1, id, maxLen = 1, k = 2;
        for(int i = 1; i < n; i++)
        {
            if(i < mx)
            {
                p[i] = min(mx - i, p[id * 2 - i]);
            }
            else
                p[i] = 1;
            while(i + p[i] < n && str[i - p[i]] == str[i + p[i]])
                p[i]++;
            if(mx < i + p[i])
                mx = i + p[i], id = i;
            if(p[i] > maxLen)
            {
                maxLen = p[i];
                k = i;
            }
        }
        string ret1 = "", ret2 = "";
        int j = 0;
        while(j < maxLen)
        {
            if(str[k + j] != '#')
                ret1 += str[k + j];
            j++;
        }
        ret2 = ret1;
        reverse(ret1.begin(), ret1.end());
        j = 1;
        while(j < maxLen)
        {
            if(str[k - j] != '#')
                ret1 += str[k - j];
            j++;
        }
        return ret1;
    }




    string longestPalindrome(string s) {
        string ret = Manacher(s);

        return ret;


    }
};

 

posted @ 2022-03-21 00:16  WTSRUVF  阅读(32)  评论(0编辑  收藏  举报