s
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include<bits/stdc++.h> using namespace std;
int BL(string a, string b) { int i=1,j=1; while(i<a.size() && j<b.size()) { if(a[i]==b[j]) { i++,j++; }else{ i = i - j + 2; j = 1; } } if(j==b.size()) { return i - j + 1 ; } return -1; }
int nex[100];
void get_next(string s) { int i = 1,j = 0; nex[1] = 0; while(i<s.size()) { if(j==0 || s[i]==s[j]) { i++,j++; nex[i] = j; }else{ j = nex[j]; } } }
int KMP(string a,string b) { get_next(b); for(int i = 1;i<=b.size();i++) { cout << nex[i] <<" "; } int i = 1, j = 1; for(;i<a.size() && j<b.size();) { if(j == 0 || a[i]==b[j]) { cout << i <<" " << j <<" "<< a[i] <<" "<<b[j] <<"\n"; i++,j++; }else{ j = nex[j]; cout <<"进行修改"<< i <<" "<< j <<"\n"; } } if(j>=b.size()) { return i-b.size()+1; } return -1; }
int main() { string a,b; a = "0ababcabcacbab"; b = "0abcac"; cout << KMP(a,b); return 0; }
|
上面主要写了KMP的算法,KMP的主要思想就是先求出next数组,这个数组的作用是当主串与子串匹配失败时,将子串的指针修改成next的值,这样也就避免主串回溯了,保证了效率