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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_34168157/article/details/83146967

首先模式匹配算法解决的问题是在一个主串和一个模式匹配串中查找相同的模式匹配串,如果相等,则返回当前模式匹配串的起始位置,否则返回-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];
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/baidu_34168157/article/details/83146967