美文网首页
数据结构与算法11-字符串匹配KMP

数据结构与算法11-字符串匹配KMP

作者: 随意昵称你能懂得 | 来源:发表于2020-04-27 19:26 被阅读0次

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。
KMP算法的时间复杂度O(m+n)。
代码中的T[0]和S[0]为数组长度。

/*
 KMP 算法
 */
void get_next(String T, int *next) {
    int i, j;
    i = 0;
    j = 1;
    
    next[1] = 0;
    while (j < T[0]) {
        if (i == 0 || T[i] == T[j]) {
            i++;
            j++;
            next[j] = i;
        } else {
            i = next[i];
        }
    }
}

int Index_KMP(String S, String T, int pos) {
    int next[MAXSIZE];
    get_next(T, next);
    
    int i = pos;
    int j = 1;
    while (i < S[0] && j <= T[0]) {
        if (j == 0 || S[i] == T[j]) {
            i++;
            j++;
        } else {
            j = next[j];
        }
    }
    
    if (j > T[0]) {
        return i - T[0];
    } else {
        return -1;
    }
}

代码优化,减少回退的长度

/*
 KMP优化
 */
void get_next(String T, int *next) {
    int i, j;
    i = 0;
    j = 1;
    
    next[1] = 0;
    while (j < T[0]) {
        if (i == 0 || T[i] == T[j]) {
            i++;
            j++;
            
            if (T[i] != T[j]) {
                next[j] = i;
            } else {
                next[j] = next[i];
            }
        } else {
            i = next[i];
        }
    }

相关文章

  • KMP算法文章合集

    字符串的查找:朴素查找算法和KMP算法 暴力匹配算法与KMP算法(串的匹配) 字符串查找算法BF和KMP 字符串匹...

  • 深入解析KMP算法

    标签(空格分隔): 数据结构与算法 KMP算法是一个经典的字符串匹配算法,但是原理比较晦涩难懂,这里推荐一篇个人感...

  • leetcode字符串匹配算法之KMP算法

    本篇介绍一种高效的字符串匹配算法——KMP算法。 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • 数据结构与算法——基础篇(一)

    前置问题 经典问题与算法 8皇后问题(92种摆法)——回溯算法 字符串匹配问题——KMP算法(取代暴力匹配) 汉诺...

  • 字符串匹配与KMP算法

    1.朴素字符串匹配算法 2.KMP算法 求前缀函数 实现KMP算法 3.测试代码

  • 数据结构—KMP算法

    KMP算法是一种改进的字符串算法 KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速...

  • 常见算法题之字符串

    1、KMP算法 参考:july大神的KMP博客细节不摆,该算法由暴力字符串来匹配,具体是由字符串匹配的暴力写法而来...

  • KMP算法(字符串匹配问题)

    一、是什么? 注意,是KMP算法,不是MMP哈,我没有骂人。KMP算法是用来做字符串匹配的,除了KMP算法分,还有...

  • KMP算法——寻找子串位置

    KMP算法——寻找子串位置 1、KMP算法简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • KMP算法

    KMP算法是解决字符串匹配问题的有高效算法 代码:

网友评论

      本文标题:数据结构与算法11-字符串匹配KMP

      本文链接:https://www.haomeiwen.com/subject/egmqwhtx.html