判断一个字符串中是否包含另一个字符串(KMP、BF)

时间:2023-03-09 16:47:33
判断一个字符串中是否包含另一个字符串(KMP、BF)

判断一个字符串是否是另一个字符串的子串,也就是strstr()函数的实现,简单的实现方法是BF算法。

1.BF算法

int BF(char *s, char *p){
if(s==NULL || p==NULL)return -;
int i=;
int j;
while(i<strlen(s)){
j=;
while(s[i]==p[j] && j<strlen(p)){
i++;
j++;
}
if(j==strlen(p))return i-j;
i=i-j+;
}
return -;
}

2.KMP算法

KMP算法的原理有很多文章解释,这就不说了(我也看得不是很懂......)。整个KMP算法的关键点在于next数组的实现。

KMP算法主体:

int KMP(char *s, char *p){
if(s==NULL || p==NULL)return -;
int next[];
get_next(next, p);
int i=;
int j=;
while(i<strlen(s)){
if(j==- || s[i]==p[j]){
i++;
j++;
}else{
j=next[j];
}
if(j==strlen(p))return i-j;
}
return -;
}

get_next函数的实现:

void get_next(int *next, char *p){
if(next==NULL || p=NULL)return;
int i=;
int j=-;
next[]=-;
while(i<strlen(p)-){
if(j==- || p[i]==p[j]){
i++;
j++;
next[i]=j;
}elseP{
j=next[j];
}
}
}

注意,get_next函数的实现只与子字符串有关系...