void next_data(char mode[], int* next)
{
int i = 0;
int k = 0;
next[0] = 0;
int str_len2 = strlen(mode);
for (i = 1; i < str_len2; i++)//i 是遍历next的各个元素位置,同时也是不同的长度
{
while (mode[i] != mode[k] && k >= 1)//k是从0开始,且匹配到的元素个数
{
k = next[k - 1];
}
if (mode[i] == mode[k])
{
k++;
}
next[i] = k;
}
}
void kmp(char* data, char* match)//未匹配到返回-1,匹配到返回坐标位置; 如果有多个,再讨论
{
int str_len1 = strlen(data);
int str_len2 = strlen(match);
int* next = (int*)malloc(sizeof(int)*str_len2);
next_data(match, next);
int i = 0;
int j = 0;
for (int i = 0; i < str_len1; i++)
{
while (data[i] != match[j] && j >= 1)
{
j = next[j - 1];
}
if (data[i] == match[j])
{
j++;
}
if (j == str_len2)
{
cout << "find:" << "pos:" << i - str_len2 + 1 << endl;
//return (i - str_len2 + 1);
j = 0;//打印出所有的位置
}
}
if (next)
{
free(next);
next = NULL;
}
}
//1.暴力两次循环
//2.kmp
//1)next 数组
char data[] = "abcdefcdghcd";
char mode[] = "cd";
kmp(data, mode);