今天在此学习了一下kmp算法,和以前的不太一样,这个next[0] = -1,写了个程序
# include <stdio.h>
# include <string.h>
int next[50];
void getNext(char *p){
memset(next,0,sizeof(next));
int len = strlen(p);
next[0] = -1;
int i,j;
i=-1;
j=0;
while(j<len-1){
if(i==-1 || p[i]==p[j]){
i++;
j++;
next[j] = i;
} else{
i = next[i];
}
}
}
int match(char *s,char *p){
int i=0,j=0;
int sLen = strlen(s);
int pLen = strlen(p);
//while(i<sLen && j<pLen){
while(i<strlen(s) && j<strlen(p)){
if(j==-1 || s[i]==p[j]){
i++;
j++;
} else{
j=next[j];
}
printf("aaaaaaaa %d %d %d %d\n",i,strlen(s),j,strlen(p));
}
if(j==strlen(p)) printf("match %d\n",i);
}
int main(){
char s[100] = "bbc abcdab abcdabcdabde";
char p[50] = "abcdabdabcdabcf";
char p1[50] = "abcdabd";
getNext(p1);
match(s,p1);
}
因为j 是int型,而且可能等于-1,查了一下strlen函数,返回值是unsigned int类型,比较时会把 int 自动转换成 unsigned int ,-1 就转换成 0xffffffff,循环结束了
而上一行不会有问题。。。
c 调用函数有返回值的话 尽量去接收,不要直接操作返回值