一、传统做法
int get_index(char a[],char b[])//返回字符串b在a中的位置
{
int i=0,j=0;
int a_len=strlen(a);
int b_len=strlen(b);
while(i<a_len && j<b_len)
{
if(a[i]==b[i]) i++,j++;
else
i=i-j+1,j=0;
}
if(j>=b_len)
return i-b_len;
else
return -1;
}
二、KMP算法
int get_index(char a[],char b[])
{
int i=0,j=0;
int a_len=strlen(a);
int b_len=strlen(b);
int next[nMax];
get_next(b,next);
while(i<a_len && j<b_len)
{
if(j==-1 || a[i]==b[j]) i++,j++;
else
j=next[j];
}
if(j>=b_len)
return i-b_len;
return -1;
}
/*
next[]的求法:
设next[i]==next[j],求next[i+1]
因为next[i]==next[j],所以b[0,j-1]==b[i-j,i-1]。
情况一:b[j]==b[i],所以next[i+1]=next[i]+1;
情况二:b[j]!=b[i],则执行j=next[j]循环,直到满足b[j]==b[i],执行next[i+1]=next[j]+1;
如果都不满足b[j]==b[i],最后j为-1,则next[i+1]=0;
*/
void get_next(char b[],int next[])
{
int b_len=strlen(b);
int i=0,j=-1;nest[0]=-1;
while(i<b_len)
{
if(j==-1 || b[i]==b[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
/*
上面解法存在一缺陷:若b[]="aaaab";
则求出next[]={-1,0,1,2,3}
但是从上述字符串可以看出,因为前四个字符相等,所以如果不匹配,就不要与前面再与前面的字符进行判断,这样再循环的时候就需要进行一次判断如果b[i+1]==b[j+1],则执行next[i+1]=next[j+1],这样就可避免这个问题。
从而得出的new_next[]={-1,0,0,0,3}
*/
//改进后的算法
void get_next(char b[],int next[])
{
int b_len=strlen(b);
int i=0,j=-1;
while(i<b_len)
{
if(j==-1 || b[i]==b[j])
{
i++;
j++;
if(b[i]!=b[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
}
16万+

被折叠的 条评论
为什么被折叠?



