Maktub_Wiki Maktub_Wiki
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
  • 经济周期笔记
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
  • 经济周期笔记
  • 数据结构

    • 树状数组
    • 位存储
    • 并查集
  • 算法

    • Floyd算法
    • Dijkstra算法
    • Bellman-Ford算法
    • Prim算法
    • Kruskal算法
    • KMP算法
    • Leetcode
    • 算法
    Maktub_小明
    2024-01-14
    目录

    KMP算法

    # 说明

    快速匹配相同的子字符串

    # 代码模版

    模版1

    class Solution:
        def strStr(self, haystack: str, needle: str) -> int:
            def KMP(s, p):
                """
                s为主串
                p为模式串
                如果t里有p,返回打头下标
                """
                nex = getNext(p)
                i = 0
                j = 0   # 分别是s和p的指针
                while i < len(s) and j < len(p):
                    if j == -1 or s[i] == p[j]: # j==-1是由于j=next[j]产生
                        i += 1
                        j += 1
                    else:
                        j = nex[j]
    
                if j == len(p): # j走到了末尾,说明匹配到了
                    return i - j
                else:
                    return -1
    
            def getNext(p):
                """
                p为模式串
                返回next数组,即部分匹配表
                """
                nex = [0] * (len(p) + 1)
                nex[0] = -1
                i = 0
                j = -1
                while i < len(p):
                    if j == -1 or p[i] == p[j]:
                        i += 1
                        j += 1
                        nex[i] = j     # 这是最大的不同:记录next[i]
                    else:
                        j = nex[j]
    
                return nex
            
            return KMP(haystack, needle)
    

    模版2

    def KMP(s: str, p: str) -> List[int]:
        ans = []
        x = p + '#' + s
        pi = [0] * len(x)
        for i in range(1, len(x)):
            j = pi[i-1]
            while j > 0 and x[i] != x[j]:
                j = pi[j-1]
            if x[i] == x[j]:
                j += 1
            pi[i] = j
            if pi[i] == len(p):
                ans.append(i - 2 * len(p))
        return ans
    
    上次更新: 2025/09/14, 08:53:50
    Kruskal算法

    ← Kruskal算法

    Theme by Vdoing | Copyright © 2021-2025 Maktub_小明 | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式