• Shortest Palindrome


    Shortest Palindrome

    Total Accepted: 13465 Total Submissions: 74427 Difficulty: Hard

    Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.

    For example:

    Given "aacecaaa", return "aaacecaaa".

    Given "abcd", return "dcbabcd".

     
    Show Tags
     

    先用manacher求出以第一个字符开头的最长回文的长度,然后把剩下的字符逆序放在原始串的前面

    class Solution {
    public:
        void preProcess(string &s,int sSize,string& copedStr){
            for(int i=0;i<sSize;i++){
                copedStr.push_back('*');
                copedStr.push_back(s[i]);
            }
            copedStr.push_back('*');
        }
        int longestPalindromeLengthStartWithFirstChar(string s) {
            int sSize = s.size();
            if(sSize<=1){
                return sSize;
            }
            string str;
            preProcess(s,sSize,str);
            int strSize = 2*sSize+1;
            vector<int> parr(strSize,1);
            int mid = 0;
            int left =-1,right = 1;
            int pl = -1, pr = 1;
            int radius = 0;
            for(;right<strSize;right++){
                radius = 0;
                if(right>=pr){
                    while((right-radius>=0 && right+radius<strSize) && str[right-radius]==str[right+radius]){
                        radius++;
                    }
                    parr[right] = radius;
                }else{
                    left = mid - (right-mid);
                    if(left - parr[left] +1 < pl+1){
                        parr[right] = left - pl;
                    }else if(left - parr[left] +1 > pl+1){
                        parr[right] = parr[left];
                    }else{
                        radius = parr[left]-1;
                        while((right-radius>=0 && right+radius<strSize) && str[right-radius]==str[right+radius]){
                            radius++;
                        }
                        parr[right] = radius;
                    }
                }
                radius = parr[right] ;
                if(right + radius >= pr){
                    pr = right + radius ;
                    pl = right - radius ;
                    mid = right;
                }
            }
            int maxLen = 1;
            for(int i=1;i<strSize;i++){
                if(i-parr[i]+1<=1){
                    int tmpRadius = i%2==0 ? parr[i]-1:parr[i];
                    if(tmpRadius>maxLen ){
                        maxLen = parr[i]-1;
                    }
                }
            }
            return maxLen;
        }
        string shortestPalindrome(string s) {
            int j = longestPalindromeLengthStartWithFirstChar(s);
            string tmpStr;
            cout<<j<<endl;
            for(int i=s.size()-1;i>=j;i--){
                tmpStr.push_back(s[i]);
            }
            return tmpStr+s;
        }
    };
  • 相关阅读:
    System.DateUtils 1. DateOf、TimeOf 简单修饰功能
    Servlet高级
    Servlet基础
    AOP的基本概念
    Bean的定义及作用域的注解实现
    Bean
    centos7系统下,配置学校客户端网络记录
    CUDA并行编程思维过程
    CUDA(GPU)OPENCV
    3-决策树
  • 原文地址:https://www.cnblogs.com/zengzy/p/5034442.html
Copyright © 2020-2023  润新知