/*
给定一个字符串 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;
}
【Leetcode】5.最长回文子串C++(马拉车算法)
猜你喜欢
转载自blog.csdn.net/weixin_44936889/article/details/104066516
今日推荐
周排行