kmp算法的思想点击打开链接
当时学习思想的时候看的是这个地址,但是代码与他的思想略有不同,next数组第一个是-1 然后next[j]代表的是 前j-1 并不加上j
#include <stdio.h>
#include <string.h>
using namespace std;
char text[1000100];
char pattern[1000100];
void get(char pattern[],int next[])
{
int i = 0,j = -1;
next[0] = -1;
while(pattern[i]!='\0'){
if(j==-1||pattern[i]==pattern[j]){
i++;
j++;
next[i] = j;
}else {
j=next[j];
}
}
}
int kmp(char text[], char pattern[])
{
int len = strlen(pattern);
int next[len+1];
get(pattern,next);
int i = 0, j = 0, index = 0;
while(text[i]!='\0'&&pattern[j]!='\0'){
if(text[i] == pattern[j]){
i++;
j++;
}else {
index+= j-next[j];
if(next[j]!=-1){
j = next[j];
}else {
i++;
j = 0;
}
}
}
if(pattern[j]=='\0'){
return index+1;
}else{
return -1;
}
}
int main()
{
while(~scanf("%s %s", text, pattern)){
printf("%d\n", kmp(text,pattern));
}
return 0;
}