美文网首页
KMP 算法

KMP 算法

作者: riveraiyanzi | 来源:发表于2017-07-16 01:39 被阅读10次

KMP 算法要解决的是在字符串 S 中寻找模式字符串 P 的问题。

naive 的方法是两重循环,时间复杂度 O(m*n)。KMP 的时间复杂度为 O(m+n)。

其实并不复杂,分两步:

  1. 求出 P 的 Partial Match Table
  2. 借助 table 搜索 S

时间复杂度 O(m+n)。关键步骤是求出 P 的 Partial Match Table,其含义是

The length of the longest proper prefix in the (sub)pattern that matches a proper suffix in the same (sub)pattern

其中,

Proper prefix: All the characters in a string, with one or more cut off the end. “S”, “Sn”, “Sna”, and “Snap” are all the proper prefixes of “Snape”
Proper suffix: All the characters in a string, with one or more cut off the beginning. “agrid”, “grid”, “rid”, “id”, and “d” are all proper suffixes of “Hagrid”

实现如下

public int[] kmpTable(String p) {
    // 一开始是声明 p.length() 长度的数组来表示相应位的状态,但是 table[1] = 1 时会一直循环
    int[] table = new int[p.length()+1];
    int i = 2, cnt = 0;
    while (i <= p.length()) {
        if (p.charAt(i - 1) == p.charAt(cnt)) {
            table[i++] = ++cnt;
        } else if (cnt > 0) {
            cnt = table[cnt];
        } else {
            table[i++] = 0;
        }
    }
    return table;
}

参考文献

  1. http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/

相关文章

  • KMP 专题整理

    KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...

  • 对KMP算法的一些理解

    最近学到KMP算法,下面讲讲对KMP算法的一些个人理解,希望对大家有帮助! 对于KMP算法的理解: 整个KMP算法...

  • KMP算法文章合集

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

  • 串的模式匹配算法

    KMP算法 算法匹配

  • 问答|KMP算法学习笔记

    问题 目录KMP是什么,做什么用的KMP算法的高效体现在哪如何KMP算法的next数组KMP的代码KMP的时间复杂...

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

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

  • 字符串匹配 - KMP算法

    前面我们介绍非常高效的 BM 算法,今天我们介绍另一个非常出名且高效的 KMP 算法。 KMP 算法思想 KMP ...

  • KMP算法及优化

    转载请注明出处: KMP算法及优化 今天看到同学在复习数据结构书上的KMP算法,忽然发觉自己又把KMP算法忘掉了,...

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

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

  • KMP算法

    KMP算法

网友评论

      本文标题:KMP 算法

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