朴素模式匹配算法

文章介绍了两种朴素模式匹配算法,一种通过定位操作,另一种利用数组下标。在匹配失败时,算法会更新主串指针,继续寻找可能的匹配子串。最多需要对比n-m+1个子串。当模式串完全匹配时,返回子串在主串中的起始位置。
摘要由CSDN通过智能技术生成

朴素模式匹配算法

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和安韩Pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值