被这个破算法搞晕了,只能硬背下来了:(
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
//2021-3-19 10:06
const int MAXM = 1000;
int nextTable[MAXM];
void GetNextTable(string A) {
int j = 0;
nextTable[j] = -1;
int i = nextTable[j];
while (j < A.size()) { //求nextTable[j],所以j不回溯,匹配失败时i回溯
if (i == -1 || A[j] == A[i]) {
i++;
j++;
nextTable[j] = i; //更新nextTable
} else {
i = nextTable[i]; //i回溯
}
}
return;
}
bool KMP(string str, string P) {
GetNextTable(P);
int i = 0;
int j = 0;
while (i < str.size() && j < P.size()) { //匹配时,i指向主串,i不会回溯,j指向模式串,匹配失败时j会回溯
if (j == -1 || str[i] == P[j]) {
i++;
j++;
} else {
j = nextTable[j]; //j回溯
}
}
if (j == P.size()) {
return true;
} else {
return false;
}
}
int main() {
string str, pattern;
while (cin >> str >> pattern) {
if (KMP(str, pattern)) {
printf("Match\n");
} else {
printf("No match\n");
}
}
return 0;
}

京公网安备 11010502036488号