Manacher 算法 模板(求一个字符串的最长回文串)

#include <iostream>
#include <cstring>

using namespace std;

string longestPalindrome(string s)
{
    
    string str = "?#";
    for(int i = 0; i < s.size(); i++)   //字符串长度奇偶变换,添加'$'防止数组越界
    {
        str += s[i];
        str += "#";
    }
    str += "?";
    //cout<<str;
 
    int p[str.size()-2]={0};    //定义p[i]数组

    int right = 0, mid = 0;
    for(int i = 1; i <  str.size()-1; i++)
    {
        if(right > i)
        {
            p[i] = (p[2*mid - i] < (right - i) ? p[2*mid - i] : (right - i));   //计算以i为中心的回文字串的最小长度
        }
        else
        {
            p[i] = 1;
        }

        while(str[i - p[i]] == str[i + p[i]])  p[i]++;     //回文子串长度延伸
        
        if(i + p[i] > right)
        {
            right = i + p[i];
            mid = i;
        }

    }
        
    int max = 0, middle=0;
    for(int i = 1; i < str.size()-1; i++)   //生成最终结果
    {
        if(p[i] > max)
        {
            middle = i;
            max = p[i];
        }
    }
    max--;
        
    int start = middle - max ;
    int end = middle + max;
    string result;
    for(int i = start; i <= end; i++)
    {
        if(str[i] != '#' && str[i] != '?')
        {
            result += str[i];
        }
    }
    //cout<<result;
    return result; 
}
int main()
{
    string s1="xschhsdr";
    string s2="vffabbaabbbabaababbbacisd";
    cout<<longestPalindrome(s1)<<endl;
    cout<<longestPalindrome(s2)<<endl;
    return 0;
}
 
  
 


猜你喜欢

转载自www.cnblogs.com/bhd123/p/9664570.html