manacher算法 解决回文字符串问题 c++

#include <iostream>

using namespace std;

class Solution
{
public:
    int manacher(string str)
    {
       if(str.size()<1) return 0;
       string new_str="";
       manacher(str,new_str);
       int length=new_str.size();
       int* pA=new int[length]();
       int index=-1;
       int pR=-1;
       int max_length=-1;
       for(int i=0;i<length;i++)
       {
           pA[i]=pR>i?min(pA[2*index-i],pR-i):1;
           while(i-pA[i]>-1 && i+pA[i]<length)
           {
               if(new_str[i-pA[i]]!=new_str[i+pA[i]])
               {
                   break;
               }
               pA[i]++;
           }
           if(i+pA[i]>pR)
           {
               pR=i+pA[i];
               index=i;
           }
           max_length=max(max_length,pA[i]);
       }

       delete[] pA;
       return max_length-1;
    }

private:
    void manacher(string str,string& new_str)
    {
        for(int i=0;i<str.size();i++)
        {
            new_str.push_back('#');
            new_str.push_back(str[i]);
        }
        new_str.push_back('#');
    }
};

class Solution2
{
public:
    string shortestEnd(string str)
    {
        if(str.size()<1) return "";
        string new_str;
        shortestEnd(str,new_str);
        int length=new_str.size();
        int* pA=new int[length]();
        int index=-1;
        int pR=-1;
        int lastR=-1;
        for(int i=0;i<length;i++)
        {
            pA[i]=pR>i?min(pA[2*index-i],pR-i):1;
            while(i-pA[i]>-1 && i+pA[i]<length)
            {
                if(new_str[i-pA[i]]!=new_str[i+pA[i]])
                {
                    break;
                }
                pA[i]++;
            }
            if(i+pA[i]>pR)
            {
                pR=i+pA[i];
                index=i;
            }
            if(pR==length)
            {
                lastR=i;
                break;
            }
        }
        string result="";
        int re_len=2*lastR-length;
        for(int i=re_len;i>0;i-=2)
        {
            result.push_back(new_str[i]);
        }

        delete[] pA;

        return result;
    }
private:
    void shortestEnd(string str,string& new_str)
    {
        for(int i=0;i<str.size();i++)
        {
            new_str.push_back('#');
            new_str.push_back(str[i]);
        }
        new_str.push_back('#');
    }
};

int main()
{
    string str1="abcd123321";
    Solution2 ss;
    cout<<ss.shortestEnd(str1)<<endl;
 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/csu_guo_liang/article/details/81175958