模式匹配算法思想和实现KMP

首先模式匹配算法解决的问题是在一个主串和一个模式匹配串中查找相同的模式匹配串,如果相等,则返回当前模式匹配串的起始位置,否则返回-1
实现思路:
/**

  • 首先第一个大前提就是长度
  • 第二个是判断二者是否相等,然后同时后移
  • 否则直接回退到i = i - j + 1 (每次在原来的基础上后移一位)j=1,
  • 返回主串匹配的模式串的首地址 j > t[0] 返回是 I- t[0]
    */
    代码实现
   int ModelStartType(SString s,SString t){
        //模式匹配算法,比较字符串S中是否包含子串t,如果包含,返回开始匹配下标,否则返回-1
        //定义初试比较下标
        int i=1,j= 1;
        //首先保证比较的两个字符串长度大于等于1
        while(i <= s[0] && t <= t[0]){
            //然后进行比较 ==
            if (s[i] == t[j]){
                //如果相等,二者同时进行后移继续比较
                i++;
                j++;
            }else {
                //否则进行回退再次比较,指针进行回退继续比较
                i = i - j + (1 + 1);
                j = 1;
            }
            //返回主串匹配到的模式串的首地址
            if (j > t[0]){
                return i - t[0];
            }else {
                return 0;
            }
        }
    }

实现思路:这里采用KMP算法进行优化,每次在比较出现回退到初试位置进行优化,新增next记录将要移动的字符,从而提高了比较的效率,不用每次都回到到1
/**
* t是需要进行校验的字符串,next用于保存下一次将要比较的移动的字符串
* 首先第一个大前提是 需要比较的字符串长度
* 如果移动的位置为0或者字符串的 在二者前后值进行比较,相等
* 后者同时进行后移,next用于存储j下一次需要移动的字符
* 否则交换的字符赋值给j
* */

 void get_next(char t[],int next[]){
       //使用改进的KMP算法进行判断模式子串在字符串中的匹配位置
        int i = 1;
        next[1] = 0;
        int j = 0;
        //t[0] 用于保留字符串的长度
        while(i <= t[0]){
            if (j == 0 || t[i] == t[j]){
                ++i;
                ++j;
                next[i] = j;
            }else {
                j = next[j];
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值