BF朴素匹配
时间复杂度 \(O(n*m)\)
1 2 3 4 5 6 7 8 9 10 11
| int BF_Search(const string &txt,const string &pat){ int lt = txt.length(); int lp = pat.length(); int i = 0,j = 0; while(i < lt && j < lp){ if(txt[i] == pat[j]) {i++ ; j++;} else {i -= j-1 ; j = 0;} } if(j == lp) return i-lp; return -1; }
|
KMP算法
时间复杂度 $ O(n+m)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #define MAXLEN 1000 int Next[MAXLEN];
void GetNext(const string &pat,int Prefix[]){ int len = pat.length(); Prefix[0] = 0; int j = 0; for(int i = 1 ; i < len ; i ++){ while(j > 0 && pat[i] != pat[j]){j = Prefix[j-1];} if(pat[i] == pat[j]){j++;} Prefix[i] = j; } }
int KMP_Search(const string &txt,const string &pat){ int lt = txt.length(); int lp = pat.length(); int i = 0; int j = 0; while(i < lt && j < lp){ if(txt[i] == pat[j]){i++;j++;} else if(j == 0) i++; else {j = Next[j-1];} } if(j == lp) return i-lp; return -1; }
|
KMP统计子串个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int KMPSearchCount(const string & txt,const string & pat){ int lt = txt.length(); int lp = pat.length(); int i = 0; int j = 0; int cnt = 0; while(i < lt && j < lp){ if(txt[i] == pat[j]){i++;j++;} else if(j == 0 ){i++;} else {j = Prefix[j-1];} if(j == lp){i -= (lp-1);j=0;cnt++;} } return cnt; }
|
模板题
P3375 【模板】KMP -
洛谷 | 计算机科学教育新生态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include<bits/stdc++.h> using namespace std; const int maxn = 1e6+5;
int Next[maxn],lp,lt; bool f[maxn]; string pat,txt;
void getNext(){ Next[0] = 0; for(int i = 1, j = 0 ; i < lp ; i ++){ while(j > 0 && pat[j] != pat[i]){j = Next[j-1];}; if(pat[j] == pat[i]){j++;} Next[i] = j; } }
bool kmp(){ int i = 0, j = 0; while(i < lt && j < lp){ if(txt[i] == pat[j]){i++;j++;} else if(j > 0) {j = Next[j-1];} else {i++;} if(j == lp){f[i-lp] = true; i -= (lp-1); j = 0;} } return j == lp; }
int main(void){ cin>>txt>>pat; lt = txt.length(); lp = pat.length(); getNext(); kmp(); for(int i = 0 ; i < lt ; i ++){ if(f[i]) cout<<i+1<<"\n"; } for(int i = 0 ; i < lp ; i ++){ cout<<Next[i]<<" "; } return 0; }
|