求最长的回文子串 manacher算法
2016-12-04 01:20
330 查看
参考:http://blog.sina.com.cn/s/blog_70811e1a01014esn.html
首先,将字符串都变成奇数字符串(如:将12121变成$1#2#1#2#1*,考虑到边界问题,将第一个与最后一个设置为不同的)
首先,将字符串都变成奇数字符串(如:将12121变成$1#2#1#2#1*,考虑到边界问题,将第一个与最后一个设置为不同的)
#include <iostream> #include <cmath> #include <string> using namespace std; void findBMstr(string str) { int s=str.size(); int *rad=new int[s]; int i,j,k; for (i=1,j=0;i<s-1;) { while(str[i-j-1]==str[i+j+1]) j++; rad[i]=j; for (k=1;k<=j&&rad[i-k]!=rad[i]-k;k++) rad[i+k]=min(rad[i-k],rad[i]-k); i+=k; j=max(j-k,0); } int ma=0;j=1; for (int i=1;i<s-1;i++) { if (ma<rad[i]) { j=i; ma=rad[i]; } } int start=j-ma; int end=j+ma; for (i=start;i<=end;i++) { if (str[i]!='#') cout<<str[i]; } cout<<endl; delete []rad; } int main() { string a,b="$"; cin>>a; int size=a.size(); b+=a[0]; for (int i=1;i<size;i++) { b+='#'; b+=a[i]; } b+='*'; cout<<a<<endl; findBMstr(b); return 0; }
相关文章推荐
- 最长回文子串(Manacher算法)
- Manacher算法求最长回文子串的长度
- 最长回文子串:Manacher算法
- poj 3974 Palindrome 【最长连续回文子串,Manacher算法】
- 最长回文子串与Manacher算法
- 【Manacher算法】51nod 最长回文子串 V2
- 1088 最长回文子串 manacher算法
- 【51nod】1089 最长回文子串 V2(Manacher算法)
- lintcode最长回文子串(Manacher算法)
- 最长回文子串——Manacher算法
- O(n)的方法求最长回文子串长度(Manacher算法)
- 51nod1089 最长回文子串 V2(Manacher算法)
- HDU3068(最长回文子串manacher算法)
- 最长回文子串 V2(Manacher算法)
- 最长回文子串--轻松理解Manacher算法
- 51nod-【1089 最长回文子串 V2(Manacher算法)】
- POJ 3974 Palindrome 最长回文子串(manacher算法)
- 【算法知识总结】最长回文子串-Manacher算法
- 最长回文子串 ( manacher算法 ) HDU3068
- hihocoder 1032 最长回文子串(Manacher算法)