【Leetcode】5.最长回文子串C++(马拉车算法)

在这里插入图片描述

在这里插入图片描述

/*
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
*/

#include "iostream"
#include "string"
#include "vector"

#define MAX 1000

using namespace std;

class Solution
{
public:
    string longestPalindrome(string s)
    {
        string man_s;
        int i, s_size = s.size();
        if (s_size <= 1)
            return s;
        // 预处理
        man_s.push_back('$');
        for (i = 0; i < s_size; i++)
        {
            man_s.push_back('#');
            man_s.push_back(s[i]);
        }
        man_s.push_back('#');
        man_s.push_back('@');
        // 辅助数组p
        int len = man_s.size();
        vector<int> p(len, 0);
        // 寻找最长回文字符串
        int id = 0; //回文子串的中心位置
        int mx = 0; // 回文子串的最后位置
        int j;      // j=2*id-i是i关于id的对称点
        // 关键公式:p[i]=min(mx-i, p[2*id-i])
        for (i = 1; i < len - 1; i++)
        {
            if (i < mx)
            {
                j = 2 * id - i;
                p[i] = mx < p[j] ? mx : p[j];
            }
            // 向两边扩展,$和@防止越界
            while (man_s[i - p[i] - 1] == man_s[i + p[i] + 1])
            {
                p[i] += 1;
            }
            // 更新中心
            if (p[i] > mx)
            {
                mx = p[i];
                id = i;
            }
        }
        string ans;
        for (i = id - mx; i <= id + mx; i++)
        {
            if (man_s[i] != '#')
            {
                ans.push_back(man_s[i]);
            }
        }
        return ans;
    }
};

int main(void)
{
    string s;
    cin >> s;
    Solution So;
    string ans = So.longestPalindrome(s);
    cout << ans << endl;
    return 0;
}
发布了66 篇原创文章 · 获赞 126 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44936889/article/details/104066516