两个视频搞懂KMP字符串匹配(详细代码)【C++】
KMP算法讲解1
KMP算法讲解2
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
#include <vector>
#include <string>
#include <cctype>
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
void kmp_prefix(string T, int prefix[], int n) {
prefix[0] = 0;
int len = 0;
int i = 1;
while(i < n) {
if(T[i] == T[len]) {
len++;
prefix[i] = len;
i++;
}
else {
if(len > 0 ) {
len = prefix[len - 1];
}
else {
prefix[i] = len;
i++;
}
}
}
for(int j = n - 1; j > 0; j--) {
prefix[j] = prefix[j - 1];
}
prefix[0] = -1;
}
void kmp (string P, string T, int prefix[], int m, int n) {
kmp_prefix(T, prefix, n);
int i = 0;
int j = 0;
while(i < m) {
if(j == n-1 && P[i] == T[j]) {
cout<<"Found T at "<<i - j<<endl;
j = prefix[j];
};
if(P[i] == T[j]) {
i++;
j++;
}
else {
j = prefix[j];
if(j == -1) {
i++;
j++;
}
}
}
}
int main () {
string P = "aabaabaac";
string T = "aa";
int m = int(P.length());
int n = int(T.length());
int prefix[n];
kmp(P, T, prefix, m, n);
return 0;
}
Found T at 0
Found T at 3
Found T at 6
Program ended with exit code: 0
Copyright © 2020 wyq. All rights reserved. |
---|