KMP算法
Published on 2024-03-30 15:28 in 分类: 算法 with 真真夜夜
分类: 算法

KMP算法

Next数组求解

对于字符串“abababca”,它的next如下表所示:

图片.png

void get_next(SString T, int* next) {
    int i = 1, j = 0;
    next[1] = 0;    // next[1]的值总是0
    while (i < T.length) { 
        if (j == 0 || T.ch[i] == T.ch[j]) { // 如果j处于0位或者,俩字符相等
            ++i; ++j;   // 继续比较后继字符
            next[i] = j;    // 当前的j就是next的值
        } else {
            j = next[j];    // 若字符不相等,则j利用next[j]进行回溯
        }
    }
}

考试手算:前缀后缀匹配

算法简单的语言描述一下:

  1. 当我们在做KMP算法时,会设置两个指针,i和j。i初始值位1,j初始值位0。
  2. 在KMP算法中,i在算法过程中不会减小且next[1] = 0。
  3. 当j = 0 或者 两个比较的字符相同时,跳过,++i,++j,且此时next[i]的值恰好为j。
  4. 当两个字符不同时,i不发生变化,j回溯到next[j]的位置。

Nextval数组求解

对于字符串“ababaa”,它的next如下表所示:
img

void get_nextval(SString T, int nextval[]) {
    int i = 1, j = 0;
    nextval[1] = 0;
    while(i < T.length) {
        if(j==0 || T.ch[i] == T.ch[j]) {
            ++i; ++j;
            if (T.ch[i] != T.ch[j]) nextval[i] = j;
            else nextval[i] = nextval[j];
        }
        else {
            j = nextval[j];
        }
    }
}

nextval数组解决了,j回溯之后仍然字符不相等的漏洞
考试手算:先求next数组,再求nextval数组

算法简单理解:其实就多了一个检查是否回溯之后仍然无效

posted @   真真夜夜  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示