kmp算法,看了知乎的回答,前面都看懂了,关键如何获取next数组没理解太透彻。顺着前面的思路,自己想明白了。
https://www.zhihu.com/question/21923021/answer/281346746

首先明白部分匹配表(pmt):PMT中的值是字符串的前缀集合与后缀集合的交集中最长元素的长度

上一张图:

需要明白pmt和next的关系,pmt数组整体向右移动一格,然后截掉最后一位,第一位用0补全就会得到next数组。所以获取next其实就是获取pmt。核心就变成了如何获取目标字符串的pmt,至于获取pmt的函数get_part_match_table,一两句话说不清,思路就是两个目标字符串上下做滑动窗口的操作,逐步获取数组的值,相当于又一次kmp操作

完成代码如下,已用leetcode这道题验证:

https://leetcode-cn.com/problems/implement-strstr/

# -*- coding: utf-8 -*-
def get_pmt(target_str):"""获取部分匹配表例如:target_str = 'aaabaa'part_table = [0,1,2,0,1,2]:param target_str: 要匹配的字符串:return:"""i = 1j = 0part_table = [0] * len(target_str)while i < len(target_str):if target_str[i] == target_str[j]:part_table[i] = j + 1j += 1i += 1else:if j == 0:i += 1continuej = part_table[j - 1]# if j == 0:#     i += 1# print(part_table)return part_tabledef get_next(target_str):"""获取next表:param target_str: 要匹配的字符串:return:"""part_table = get_pmt(target_str)next = [0] + part_table[:-1]return nextdef kmp(source_str, target_str):i = j = 0next = get_next(target_str)# i + len(target_str) - j <= len(source_str)这句代码判断断滑动窗口是否越界# 下面这种情况,i和j都不越界,但是滑动窗口以及越界了# aabaabaaa#       aabaaawhile i < len(source_str) and j < len(target_str) and i + len(target_str) - j <= len(source_str):if source_str[i] == target_str[j]:i += 1j += 1else:if j == 0:i += 1j = next[j]if j == len(target_str):return i - jreturn -1if __name__ == '__main__':source_str = "aabaabaaa"target_str = 'aabaaa'position = kmp(source_str, target_str)print(position)

Python kmp算法部分匹配表(pmt)和next相关推荐

  1. 若S作主串,P作模式串,试分别写出利用BF算法和KMP算法的匹配过程。

    目   录 题目: 百度文库-答案: (1) (2) MOOC标准答案: (1) (2) mooc答案-截图: 数据结构(C语言版)-严蔚敏2007 题目: 设字符串S='aabaabaabaac', ...

  2. KMP算法详解:使用部分匹配表PMT来理解KMP算法,使用Java实现

    有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍.但KMP算法真的不适合这样去学.最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉.我试 ...

  3. python KMP算法查找子字符串

    最近在刷leecode,碰见字符串检索题.原题是这样的,有两个字符串,一长一短,就看看短的是不是在长的里面,如果在返回第一个字符的下标. 因为总忘记,所以记录下我的思路是咋捋顺的,其实看这一篇就够了, ...

  4. 【gif图文】KMP算法(从暴力匹配到快速匹配)

    从暴力匹配到快速匹配(KMP算法) 学习kmp算法前,首先要先了解什么是kmp算法,kmp算法具体优点是什么,kmp的主要应用方向在哪. 然后才是,代码实现 带着以上问题,我们来一步一步学习kmp算法 ...

  5. 数据结构(十)——KMP算法

    一.KMP算法简介 1.通用暴力匹配算法 通常的字符串匹配算法流程如下: 从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串的下一个字 ...

  6. c语言主范式与编码,超详细!终于搞明白KMP算法

    小伙伴们好久不见,今天将开设"数据结构与算法"专栏,一起梳理一遍硬核课程的重要知识点,那我们开始吧 正文 「字符串匹配」是计算机的基本任务之一,举个栗子,有一个字符串"「 ...

  7. (转)KMP算法原理讲解及模板C实现

    原作者:v_JULY_v 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不 ...

  8. 数据结构与算法一篇帮助你吃下KMP算法

    模式匹配 什么是模式匹配,我们用一个案例来说明: 当S = "s1,s2,s3,s4 -sn" T="t1,t2,t3,t4 - tn" 在字符串S中寻找T字符 ...

  9. php随机匹配算法,字符串匹配的KMP算法+PHP实现

    1. 前言 看了阮一峰的字符串匹配的KMP算法,写得很好,推荐看看. 不过我想自己写个例子描述一下这个算法,顺便写个PHP实现,于是有了这篇博文. 2. 概述 [来自维基百科] 字符串搜索算法 字符串 ...

最新文章

  1. Revit和Unreal Engine真实的建筑可视化视频教程
  2. 主成分分析 图像处理 matlab,matlab信号处理与主成分分析法,毕业设计求助
  3. Chromium:安装depot_tools及获取Chromium源代码
  4. python导入random模块_Python内置模块之random
  5. Nginx 基础 ( 二)
  6. java pdf合并_Java 合并、拆分PDF文档
  7. vim 基础学习之文件跳转
  8. 三年Java开发经验,必须要掌握的知识技能树有哪些?
  9. 代码行云流水..这位刚高中毕业的 UP 主,告诉我人的学习能力没有上限
  10. iPhone OS平台:丰富的可能性
  11. Python--day46--mysql触发器
  12. 计算机考证包括cad吗
  13. Windows无法访问指定设备,路径或文件.您可能没有合适的权限访问这个项目
  14. 所有程序员都应该知道的 6 个软件开发步骤
  15. 云南大学02届计算机系,云南大学学生获得2019CCF大学生计算机系统与程序设计竞赛西...
  16. 两块同步FIFO实现乒乓操作
  17. 基于改进Bisenet的五官精确分割系统(源码&教程)
  18. 高速ViALUX DMD操控 V9501 VIS/UV with 0.95“ 1080p DMD
  19. 【JAVA】经典排序算法,注释详细+可直接运行
  20. 怎样在excel中通过出生日期计算年龄

热门文章

  1. PMP考试报名被抽查怎么办?
  2. 计算机浏览器存储技术cookie、sessionStorage、localStorage
  3. 鼻纹识别,让AI寻宠照进现实
  4. python的turtle画小人_Python绘制可爱的卡通人物 | 【turtle使用】
  5. java编写应用程序_使用Java API编写应用程序
  6. location.href的几种用法
  7. 现在学java有前途吗?
  8. 山东计算机技能考试,山东省计算机技能赛考试提纲.doc
  9. 2022-7-28 第八组wly 各种类
  10. eclipse中的clean和build功能的作用是什么