马拉车算法


manacher 算法

#include <bits/stdc++.h>
using namespace std;

string get_ss(string s){
    string ss = "$#";
    for(int i = 0;i<s.length();i++){
        ss+=s[i];
        ss+="#";
    }
    ss+="*";
    cout<<ss<<endl;
    return ss;
}
int manacher(string ss){
    int n = ss.length();
    int mx = 0;
    int id = 0;
    int MaxLeng = -1;
    vector<int> p(n,0);
    for(int i = 1;i<n-1;i++){
        if(mx>i){   
            p[i] = min(mx-i,p[id*2-i]);
        }
        else {
            p[i]=1;
        }

        while(ss[i+p[i]]==ss[i-p[i]]){
            p[i]++;
        }

        if(mx<p[i]+i){
            mx = p[i]+1;
            id = i;
        }
        MaxLeng= max(MaxLeng,p[i]-1);
    }
    return MaxLeng;
}

int main(){
    string s ;
    cin>>s;
    string ss = get_ss(s);
    cout<<manacher(ss)<<endl;
    return 0;
}

5. 最长回文子串

class Solution {
public:
    string ret="";
    string get_ss(string s){
        string ss = "$#";
        for(int i = 0;i<s.length();i++){
            ss+=s[i];
            ss+="#";
        }
        ss+="*";
        // cout<<ss<<endl;
        return ss;
    }
    void manacher(string ss){
        int n = ss.length();
        int mx = 0;
        int id = 0;
        int MaxLeng = -1;
        vector<int> p(n,0);
        for(int i = 1;i<n-1;i++){
            if(mx>i){   
                p[i] = min(mx-i,p[id*2-i]);
            }
            else {
                p[i]=1;
            }

            while(ss[i+p[i]]==ss[i-p[i]]){
                p[i]++;
            }

            if(mx<p[i]+i){
                mx = p[i]+1;
                id = i;
            }
            if(MaxLeng<=p[i]-1){
                MaxLeng= max(MaxLeng,p[i]-1);
                ret = ss.substr(i-p[i]+2,MaxLeng*2);
            }
        }
        // cout<<MaxLeng<<endl;
        // return MaxLeng;
    }

    string longestPalindrome(string s) {
        string ss = get_ss(s);
        manacher(ss);
        string ans = "";
        for(int i = 0;i<ret.length();i++){
            if(ret[i]!='#'){
                ans+=ret[i];
            }
        }
        return ans;
    }
};

文章作者: anlen123
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 anlen123 !
 上一篇
dp学习 dp学习
dp学习64. 最小路径和 /* 求一个N*M 的数组,,从0,0走到最右下角的最短数值是多少 */ package com.leecode; import java.util.Scanner; public class Main
2020-05-07 anlen123
下一篇 
vector STL 容器 vector STL 容器
vector STL 容器简介: vector是将元素置于一个动态数组中进行管理的容器 vector可以随机存取元素,支持索引值直接存取,用[]或者at()方法 vector下尾部添加或者删除元素非常快,但在中间或头部插入或者删除元素比较耗
2020-05-07 anlen123
  目录