Python kmp算法部分匹配表(pmt)和next
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相关推荐
- 若S作主串,P作模式串,试分别写出利用BF算法和KMP算法的匹配过程。
目 录 题目: 百度文库-答案: (1) (2) MOOC标准答案: (1) (2) mooc答案-截图: 数据结构(C语言版)-严蔚敏2007 题目: 设字符串S='aabaabaabaac', ...
- KMP算法详解:使用部分匹配表PMT来理解KMP算法,使用Java实现
有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍.但KMP算法真的不适合这样去学.最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉.我试 ...
- python KMP算法查找子字符串
最近在刷leecode,碰见字符串检索题.原题是这样的,有两个字符串,一长一短,就看看短的是不是在长的里面,如果在返回第一个字符的下标. 因为总忘记,所以记录下我的思路是咋捋顺的,其实看这一篇就够了, ...
- 【gif图文】KMP算法(从暴力匹配到快速匹配)
从暴力匹配到快速匹配(KMP算法) 学习kmp算法前,首先要先了解什么是kmp算法,kmp算法具体优点是什么,kmp的主要应用方向在哪. 然后才是,代码实现 带着以上问题,我们来一步一步学习kmp算法 ...
- 数据结构(十)——KMP算法
一.KMP算法简介 1.通用暴力匹配算法 通常的字符串匹配算法流程如下: 从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串的下一个字 ...
- c语言主范式与编码,超详细!终于搞明白KMP算法
小伙伴们好久不见,今天将开设"数据结构与算法"专栏,一起梳理一遍硬核课程的重要知识点,那我们开始吧 正文 「字符串匹配」是计算机的基本任务之一,举个栗子,有一个字符串"「 ...
- (转)KMP算法原理讲解及模板C实现
原作者:v_JULY_v 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不 ...
- 数据结构与算法一篇帮助你吃下KMP算法
模式匹配 什么是模式匹配,我们用一个案例来说明: 当S = "s1,s2,s3,s4 -sn" T="t1,t2,t3,t4 - tn" 在字符串S中寻找T字符 ...
- php随机匹配算法,字符串匹配的KMP算法+PHP实现
1. 前言 看了阮一峰的字符串匹配的KMP算法,写得很好,推荐看看. 不过我想自己写个例子描述一下这个算法,顺便写个PHP实现,于是有了这篇博文. 2. 概述 [来自维基百科] 字符串搜索算法 字符串 ...
最新文章
- Revit和Unreal Engine真实的建筑可视化视频教程
- 主成分分析 图像处理 matlab,matlab信号处理与主成分分析法,毕业设计求助
- Chromium:安装depot_tools及获取Chromium源代码
- python导入random模块_Python内置模块之random
- Nginx 基础 ( 二)
- java pdf合并_Java 合并、拆分PDF文档
- vim 基础学习之文件跳转
- 三年Java开发经验,必须要掌握的知识技能树有哪些?
- 代码行云流水..这位刚高中毕业的 UP 主,告诉我人的学习能力没有上限
- iPhone OS平台:丰富的可能性
- Python--day46--mysql触发器
- 计算机考证包括cad吗
- Windows无法访问指定设备,路径或文件.您可能没有合适的权限访问这个项目
- 所有程序员都应该知道的 6 个软件开发步骤
- 云南大学02届计算机系,云南大学学生获得2019CCF大学生计算机系统与程序设计竞赛西...
- 两块同步FIFO实现乒乓操作
- 基于改进Bisenet的五官精确分割系统(源码&教程)
- 高速ViALUX DMD操控 V9501 VIS/UV with 0.95“ 1080p DMD
- 【JAVA】经典排序算法,注释详细+可直接运行
- 怎样在excel中通过出生日期计算年龄