例如模式串 “abaabcac”
思路:先从一个一个的字符,然后找他的对称,有一个字母关于某一条轴对称,就为1,两个字母关于某一条直线对称,为2。找到这个分成的字符串的最大值。
根据定义 j=1时,next【j】=0;然后加1存入数组当中,即可得到next数组中相关的值。
如果你是定义的 j=1;next【j】=-1;那么就不需要加1
a 0
ab 0
aba a b a 0 1 选取最大值1
abaa a ba a 1
abaab ab a ab ab关于字符a对称 2
abaabc 0
abaabca a baabc a 1
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
a | b | a | a | b | c | a | c |
0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
理解这个以后,我们在看next的代码
void getnext(char b[],int next[]) { int i=1,j=0; next[1]=0; //定义的是j=1 next[1]=0; while(i<strlen(b)) { if(j==0||b[i]==b[j]){ i++; j++; next[i]=j; } else j=next[j]; } }
最后是kmp的算法,比较好理解
int kmp(char a[],char b[],int pos,int next[]) { int i=pos,j=1,cnt=0; while(i<=strlen(a)&&j<=strlen(b)) { if(j==0||a[i]==b[j]) { i++; j++; } else j=next[j]; } if(j>strlen(b)) return i-strlen(b); else return 0; }