1.manacher算法
马拉车算法,在O(n)时间内解决寻找源字符串的最长回文子串S的问题的算法。朴素算法情况下对于每一个S[i]都要左右遍历其最大回文子串,所以时间复杂度是O(n2)。
参考博客:
https://www.cnblogs.com/czsharecode/p/9705358.html
https://www.cnblogs.com/yangxingsha/p/11722557.html(有错误,“从左往右计算数组P[ ], Mi为之前取得最大回文串的中心位置,而R是最大回文串能到达的最右端的值。”)
//返回源字符串S的最长回文子串
string Manacher(string s){
//预处理源串
string t = "$#";
for(int i=0; i<s.size(); i++){
t+=s[i];
t+="#";
}
//新建p数组,大小和t串一致,初始化为0 ,p[i]表示以t[i]为中心的回文串半径
vector<int> p(t.size() , 0);
//设定重要参数 mx(某回文串延伸到的最右边下标),id(mx所属回文串中心下标),
//reCenter(结果最大回文串中心下标),reLen(最大长回文长