美文网首页
KMP 算法小记

KMP 算法小记

作者: 呆木大人 | 来源:发表于2020-04-24 17:46 被阅读0次

KMP 算法 主要是用来从一个主串s中查找子串p的位置

要从 s 中找 p 首先想到的就是暴力搜索
暴力搜索示例:
s = "abcdabce"
p = "bce"

  • step 1:
abcdabce
bce

a == b ? 不相等, 则next

  • setp 2:
abcdabce
 bce

b==b ? c==c ? d==e? 显然 d!=e , next

  • step 3:
abcdabce
  bce

c == b ? 不相等 , next ......
直至到最后找出结果

这么做的话会发现比较浪费, 在 setp 2中, p中的 bc 都比较过了,能不能想办法不再比较 bc 了, 这个办法就是 kmp

下面给出 swift 版本代码 :

class Solution {
    
    var next: [Int] = [];
    
    func kmpSearch(_ s: String ,_ p: String) -> Int {
        next = getNext(p);
        let sLen = s.count;
        let pLen = p.count;
        let s = s.cString(using: .utf8);
        let p = p.cString(using: .utf8);
        
        var i = 0;
        var j = 0;
        
        while (i < sLen && j < pLen ) {
            // 当 p 与 s 第一个字符都不匹配的时候 (j == -1)
            // 或当 p 与 s 当前字符匹配成功 (s?[i] == p?[j])
            // 则进行下一个字符匹配
            if j == -1 || s?[i] == p?[j] {
                i += 1;
                j += 1;
            } else {
                // 如果 当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]
                // next[j] 即为 j 所对应的 next 值
                j = next[j];
            }
        }
        if j == pLen {
            return i - j;
        }
        return -1;
    }
    
    func getNext(_ p: String ) -> [Int] {
        let len = p.count;
        let p = p.cString(using: .utf8);
        var next = Array.init(repeating: 0, count: len);
        
        next[0] = -1;
        var k = -1;
        var j = 0;
        while j < len - 1 {
            //p[k]表示前缀,p[j]表示后缀
            if (k == -1 || p?[j] == p?[k]) {
                j += 1;
                k += 1;
                if p?[j] != p?[k] {
                    next[j] = k;
                } else { //因为不能出现p[j] = p[next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]
                    next[j] = next[k];
                }
            } else {
                k = next[k];
            }
        }
        return next;
    }
}

let so = Solution();
let result = so.kmpSearch("abaabababaaababaabaa","aabaa");

print(result);

原文地址 : 从头到尾彻底理解KMP
通读了两遍 , 大概理解了 , 脑袋记不住只能存下来了

相关文章

  • kmp算法小记

    最近学习了下kmp算法,这个算法在String中查询包含的String的效率很高,后续也有可能需要回忆和使用...

  • KMP 算法小记

    KMP 算法 主要是用来从一个主串s中查找子串p的位置 要从 s 中找 p 首先想到的就是暴力搜索暴力搜索示例:s...

  • 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 算法小记

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