Manacher演算法解決最長迴文子串問題---O(n)時間複雜度
阿新 • • 發佈:2019-02-07
#include <iostream> #include <string.h> using namespace std; void Manacher(char *src) { char *str = new char[2*strlen(src)+3]; str[0] = '$'; int i = 1; while(*src != '\0') { str[i++] = '#'; str[i++] =*src++; } str[i++] = '#'; str[i] = '\0'; int len = i; int mx=0,id; int p[len]; for(i=1; i<len; ++i) { if(mx > i) { p[i] = min(p[2*id-i], p[id]+id-i); } else { p[i] = 1; } while(str[i+p[i]] == str[i-p[i]]) { p[i]++; } if(p[i]+i > mx) { mx = p[i]+i; id = i; } } for(i=1; i<len; ++i) { cout<<p[i]<<" "; } delete[] str; } int main() { cout<<"please input a string:"<<endl; char *s=new char; cin>>s; Manacher(s); return 0; }