https://blog.youkuaiyun.com/woshidenghaitao/article/details/89439921
/*
*暴力匹配算法
*/
int easyMatch(char str1[], char str2[]) {
int i = 0, j = 0;
while (str1[i]!='\0'&& str2[j]!='\0') {
if (str1[i] == str2[j]) {//匹配成功,就依次后移
i++;
j++;
}
else {//就匹配成功,就回溯
i = i - (j - 1);
j = 0;
}
}
//判断是否匹配成功
if (str2[j]=='\0') {
return i - j;
}
else {
return -1;
}
}
void getNexts(char str2[], int next[]) {
int k = -1, j = 0;
next[0] = -1;
int len = strlen(str2);
while(j < len - 1) {
if (k == -1 || str2[j] == str2[k]) {
++k;
++j;
//p[k]表示前缀,p[j]表示后缀
if (str2[j] != str2[k]) {
next[j] = k;
}
else {
//因为不能出现p[j] = p[ next[K]],所以当出现时需要继续递
//归,next[j] = next[next[k]]
next[j] = next[k];
}
}
else {
k = next[k];
}
}
}
/*
*KMP算法
*/
int KMPsearch(char str1[], char str2[],int next[]) {
int i = 0, j = 0;
int len1 = strlen(str1), len2 = strlen(str2);
while (i < len1 && j < len2) {
if (j==-1 || str1[i] == str2[j]) {
++j;
++i;
}
else {
j = next[j];
}
}
if (j == len2) {
return i - j;
}
else {
return -1;
}
}
int main() {
char str1[] = "hello word!";
char str2[] = "ord";
将一个字符串从一个 函数传递到另一个 函数,可以用地址传递的办法,即用字符数组名作参数,也可以用指向字符的指针变量作参数。
cout << easyMatch(str1, str2);
char* a = str1, * b = str2;
cout << easyMatch(a, b) << endl;
char str3[] = "substring searching algorithm";
char str4[] = "searching";
int len = strlen(str4);
int next[9];
getNexts(str4, next);
cout << KMPsearch(str3, str4, next) << endl;
}