一種簡單的尋找回文子串的算法。可以在O(N)的時間復(fù)雜度內(nèi),求出以每個字母為對稱中心的回文子串。
屬于奇技淫巧?回文串的題很少啊。 我們還有后綴數(shù)組求回文子串的方法,可以做到
定義一些符號:
原串:
將
我們接下來還要再定義兩個數(shù)字,即:
對于
裸題。 (也沒什么好題了)
#include <stdio.h>#define M 110010char b[M],a[M<<1];int p[M<<1];#define min(a,b) ((a)<(b)?a:b)#define max(a,b) ((a)>(b)?a:b)int main() { int i,n,id,MaxL,MaxId; while(scanf("%s",b+1)!=EOF) { MaxL=MaxId=0; for(i=1;b[i]!='/0';i++) { a[i<<1]=b[i]; a[(i<<1)+1]='#'; } a[0]='?',a[1]='#'; n=(i<<1)+2,a[n]=0; for(i=1;i<n;i++) { if(MaxId>i) p[i]=min(p[2*id-i],MaxId-i); else p[i]=1; while(a[i+p[i]]==a[i-p[i]]) p[i]++; if(p[i]+i>MaxId) { MaxId=p[i]+i; id=i; } MaxL=max(MaxL,p[i]); }新聞熱點
疑難解答