class Solution {
public:
string longestPalindrome(string s) {
if(s.empty() || s.size()==1)
return s;
int strLen = s.size();
vector<char> s1(2*strLen+2,'#'); //解决奇数,偶数问题
s1[0] = '^'; //防止数组越界
int i=0;
for(int j=0; j<strLen; j++,i+=2)
{
s1[2+i] = s[j];
}
vector<int> radius(2*strLen+2, 1);
int idx=0, maxRight=0;
for(int j=1; j<s1.size(); j++)
{
if(j<maxRight)
{
radius[j] = min(radius[2*idx-j], maxRight-j+1);
}
while(radius[j]+j<s1.size() && s1[j+radius[j]]==s1[j-radius[j]])
radius[j]++;
if(radius[j]+j>maxRight)
{
maxRight = j+radius[j]-1;
idx = j;
}
}
int maxLen = 0;
for(int j=0; j<s1.size(); j++)
{
if(radius[j]>maxLen)
{
maxLen = radius[j];
idx = j;
}
}
int left= idx-maxLen+1;
int right = idx+maxLen-1;
string result = "";
while(left<=right)
{
if(s1[left] != '#')
{
result += s1[left];
}
left++;
}
return result;
}
};
最长回文字串(Manacher算法)
最新推荐文章于 2024-08-08 15:12:59 发布