KMP算法

作者: 晨阳Xia | 来源:发表于2020-11-23 18:34 被阅读0次

KMP算法解决的问题:

 KMP算法解决字符串匹配问题,给两个字符串,查找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置
时间复杂度为 o(m+n)

KMP伪代码

  1. 在串S和串T中分别设比较的起始下标i和j
  2. 如果S和T的的所有字符未比较完,则循环
    2.1 如果S[i] == T[j],继续比较S和T的下一个字符
    2.2 否则将j滑向next[j]的位置,即 j = next[j]
    2.3 如果j == -1,则将i和j分别+1,准备下一趟比较
  3. 如果T中的字符串均比较完毕,则返回匹配的起始下标,否则返回-1

next数组求解

image.png

next数组的两种求解方式

直接插入-1法

懒猫老师-数据结构-(15)KMP算法2-next数组(模式匹配,字符串匹配)

n = len(needle)
prefixArr = [0] * n
j = -1
i = 0
prefixArr[0] = -1
while i < n - 1:
    if j == -1 or needle[j] == needle[i]:
        j += 1
        i += 1
        prefixArr[i] = j
    else:
        j = prefixArr[j]
直接插入-1法 感想
移位插入-1法

KMP字符串匹配算法
三哥讲解KMP算法part1
三哥讲解KMP算法part2之寻找前缀的方法

n = len(needle)
prefixArr = [0] * len(needle)
j = 0
i = 1
while i < n:
    if needle[j] == needle[i]:
        j += 1
        prefixArr[i] = j
        i += 1
    else:
        if j > 0:
            j = prefixArr[j - 1]
        else:
            prefixArr[i] = j
            i += 1
prefixArr.insert(0,-1)
prefixArr.pop()

28. 实现 strStr()


class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        m = len(haystack)
        n = len(needle)
        if m == 0 and n == 0 or n == 0:
            return 0
        i = 0
        j = 0
        nextArr = self.prefixArr(needle)
        while i < m and j < n:
            if j == n - 1 and haystack[i] == needle[j]:
                return i - j

            if j == -1 or haystack[i] == needle[j]:
                j += 1
                i += 1
            else:
                j = nextArr[j]
        return -1


    def prefixArr(self, s:str) -> list:
        j = -1
        i = 0
        n = len(s)
        nextArr = [0] * n
        nextArr[0] = j
        while i < n - 1:
            if j == -1 or s[i] == s[j]:
                j += 1
                i += 1
                nextArr[i] = j
            else:
                j = nextArr[j]
        return nextArr

相关文章

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