KMP算法

作者: lingmacker | 来源:发表于2018-12-18 19:12 被阅读0次

字符串匹配算法之KMP

  1. KMP算法最主要的地方是求next数组,next数组保存的是当前失配节点(下标index)之前的子串subString,求出subString的所有前缀子串后缀子串中长度最长的值value,再将该值保存到next[index] = value。

  2. 代码实现(java版本)

    class KMPDemo{
        public static int KMP(String mainString, String subString){
            int m = mainString.length();
            int n = subString.length();
            
            char[] a = mainString.toCharArray();
            char[] b = subString.toCharArray();
            
            int[] next = getNext(subString);
            int j = 0;
            
            for(int i = 0; i < m; i++){
                while(j > 0 && a[i] != a[j]){
                    //如果当前字符不匹配,则j需要回到j之前的子串中,
                    //最长前缀和后缀子串的长度的下一个字符。
                    j = next[j - 1] + 1;
                }
                
                if(a[i] == b[j])
                    j++;
                if(j == n)
                    return i - n + 1;
            }
            return -1;
        }
        
        public static int getNext(String str){
            int len = str.length();
            char[] ch = str.toCharArray();
            int k = -1;
            
            int[] next = new int[len];
            next[0] = -1;
            
            for(int i = 1; i < len; i++){
                while(k > -1 && ch[k + 1] != ch[i]){
                /* 
                 * 开始时k的值为字符串的[0:i-1]子串的最长相同前缀和后缀子串的长度,
                 * 当之前的i加一后变成现在的i(即上面的i-1 ---> i)后,
                 * 当ch[k+1] != ch[i]时,
                 * 需要将k更新为前k个字符的最长相同前后缀子串的长度值,
                 * 所以 k = next[k]
                 */
                 k = next[k]; 
                }
                
                if(ch[k + 1] == ch[i])
                    k++;
                
                next[i] = k;
            }
            
        }
    }
    

相关文章

  • 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/awolkqtx.html