1.朴素模式匹配算法
基本思想:从主串的第一个字符与子串的第一个字符比较,若相等则逐一对后面字符进行比较,否则从第二个字符起与子串的第一个字符进行重新比较,知道子串中每个字符依次和主串中一个连续的字符序列相等时为止;
C语言实现:
#include<stdio.h>
#include<string.h>
int Index(char S[],char T[],int pos){/*朴素模式匹配算法*/
int i,j,slen,tlen;
i=pos,j=0;
slen=strlen(S);tlen=strlen(T);
while(i<slen&&j<tlen){
if(S[i]==T[j]){
i++;j++;
}
else{
i=i-j+1;
j=0;
}
}
if(j>=tlen)
return i-tlen;
return -1;
}
int main(){
char S[30],T[20];
int pos,flag;
scanf("%s %s %d",&S,&T,&pos);
flag=Index(S,T,pos,next);
if(flag>=0){
printf("该主串包含子串,下标为:%d\n",flag);
}else{
printf("该主串不包含子串!");
}
return 0;
}
2.KMP算法
基本思想:每当匹配过程中出现相比较的字符不相等时,不需要回退主串字符位置指针,而是利用已经得到的部分匹配结果将子串向右滑动尽可能远的距离,再继续进行比较。
C语言实现:
#include<stdio.h>
#include<string.h>
#include<time.h>
void Get_next(char p[],int next[]){/*找next[i]=j*/
int i,j,slen;
slen=strlen(p);i=0;
next[0]=-1;j=-1;
while(i<slen){
if(j==-1||p[i]==p[j]){
++i;++j;next[i]=j;
}
else{
j=next[j];
}
}
}
int Index_KMP(char S[],char p[],int pos,int next[]){/*KMP算法*/
int i,j,slen,tlen;
i=pos;
j=-1;
slen=strlen(S);tlen=strlen(p);
while(i<slen&&j<tlen){
if(j==-1||S[i]==p[j]){++i;++j;}
else{
j=next[j];
}
}
if(j>=tlen) return i-tlen;
return -1;
}
int main(){
char S[30],T[20];
int pos=1,next[23];
int flag,k=0;
scanf("%s %s %d",&S,&T,&pos);
Get_next(T,next);
flag=Index_KMP(S,T,pos,next);
if(flag>=0){
printf("KMP方式该主串包含子串,下标为:%d\n",flag);
}else{
printf("该主串不包含子串!");
}
while(k<20){
printf("next值为:%d\n",next[k]);
k++;
}
return 0;
}