1,求第一次匹配的位置
void getNext(int m){ int i=0,j=-1; Next[0]=-1; while(i < m){ if(j == -1 || p[i] == p[j]) Next[++i] = ++j; else j=Next[j]; } } bool Kmp(int n,int m){ getNext(m); int i = 0,j = 0; while(i < n && j < m){ if(j == -1 || s[i] == p[j]){ i++; j++; } else j=Next[j]; } if(j >= m) return true; else return false; }
void getNext(int m){ Next[0]=-1; int i = 0,j = -1; while(i < m){ if(j == -1 || p[i] == p[j]) Next[++i]=++j; else j = Next[j]; } } int Kmp(int n,int m){ getNext(m); int i = 0,j = 0; int ans = 0; while(i < n && j < m){ if(j == -1 || s[i] == p[j]){ i++; j++; } else j = Next[j]; if(j >= m){ ans++; j = Next[j]; } } return ans; }
3,求 Next 数组的时候
Next[++i]=++j;总是会忘了 ++i,和++j。一定注意别忘了 ++。