朴素模式匹配算法
1.方法一:即定位操作
主串长度为n,模式串长度为m
将主串中依次与模式串对比,直到找到一个完全匹配的子串,或所有的子串都不匹配为止
与上个小节中定位操作Index(S,T)相同
int Index(SString S, SString T){
int i=1,n=StrLength(S),m=StrLength(T);
SString sub;//用于暂存子串
while(i<=n-m+1){
SubString(sub,S,i,m);
if(StrCompare(sub,T)!=0){
++i;
}else{
return i;//返回子串在主串中的位置
}
}
return 0;//S中不存在与T相等的子串
}
while(i<=n-m+1)——最多对比n-m+1个子串;
SubString(sub,S,i,m)——从主串S中取出从位置i开始,长度为m的子串,放入sub里面
if(StrCompare(sub,T)!=0)++i——子串和模式串比较,若不相等,i+1,检查下一个子串;如果匹配,则直接返回当前子串起始位置i
2.方法二:直接通过数组下标实现朴素模式匹配算法
若当前子串匹配失败,则主串指针i指向下一个子串的第一个位置,模式串指针j回到模式串的第一个位置(i=i-j+2;
j=1)
#define MAXLEN 255 //预定义最大串长为255
typedef struct {
char ch[MAXLEN]; //每个分盘存储一个字符
int length; //串的实际长度
) SString;
int Index(SString S,SString T){
int i=1,j=1;
while( i<=S.length && j<= T.length){
if(S.ch[i] == T.ch[j]){
++i; ++j;//继续比较后继字符
}
else{
i = i-j+2;
j = 1;
//指针后退重新开始匹配
}
}
if(j>T.length)
return i - T.length;
else
return 0;
}
3.注意:
- 主串长度为n,模式串长度为m,最多对比
n-m+1
个子串 - 主串指针匹配失败更新时
i=i-j+2
- 当模式串指针
j>T.length
时,返回的位置为i-T.length