AB串下标都从1开始,kmp函数返回第一次成功匹配的A串下标,把其中注释去掉可以匹配多个
Next[i]表示位置长度为1-i的字符串最多有长度为Next[i]的前缀等于其后缀
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
char A[1000005],B[1000005] ; int Next[1000005],lenA,lenB ; void GetNext() { int i,j ; Next[1]=j=0 ; for(i=2 ;i<=lenB ;i++) { while(j>0 && (B[j+1]!=B[i]))j=Next[j] ; if(B[j+1]==B[i])j++ ; Next[i]=j ; } } int kmp() { int i,j ; j=0 ; for(i=1 ;i<=lenA ;i++) { while(j>0 && (B[j+1]!=A[i]))j=Next[j] ; if(B[j+1]==A[i])j++ ; if(j==lenB) { return i-lenB+1 ; //j=Next[j] ; } } return -1 ; }