字符串匹配KMP算法的基本原理及python实现_Cris_Lee卡卡卡的博客-程序员宅基地

技术标签: python  算法基础  字符串匹配  KMP  

KMP算法是字符串匹配问题中非常经典的算法。最近查找了很多相关资料,直到看到下面这两篇博客,终于理解了KMP的基本原理。
KMP算法的核心即是计算字符串M每一个位置之前的字符串的前缀和后缀公共部分的最大长度。获得M每一个位置的最大公共长度之后,就可以利用该最大公共长度快速和字符串S比较。当每次比较到两个字符串的字符不同时,我们就可以根据最大公共长度将字符串M向右移动,接着继续比较下一个位置。
强烈推荐大家看一看以下两篇博客,相信能有所收获。
首先推荐看这篇,篇幅较短,没有大量的算法细节,建议先读这篇,对KMP算法的核心思想有所把握:
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
在了解基本思想后,建议详细阅读下面这位大神的博客,写的非常清晰,认真研读之后,相信会对KMP有深入的了解,并能编程实现。
https://blog.csdn.net/v_july_v/article/details/7041827
在网上没有查到比较清晰的python解决方案,在这里给出python实现方法,
供参考。(笔者测试了多个测试用例,均通过,如有问题,欢迎指出~)

问题:

搜索字符串S中是否含有模式串P,如果有,返回True,否则返回False

基于python2实现:

def KMP(S,P):
	def next_list_generate(s):
		'''
		产生模式串的next列表,此处为KMP核心部分,强烈建议大家仔细阅读     上面的两篇博客
		'''
		if len(s) == 0 :
			return False
		if len(s) == 1:
			return [-1]
		if len(s) == 2:
			return [-1,0]
		next_list = [0]*len(s)
		next_list[0]= -1
		flag = 2
		k = 0
		while flag < len(s):
			if k == -1 or s[k]==s[flag-1]:
				k    += 1
				next_list[flag] = k
				flag += 1
			else:
				k = next_list[k]
		return next_list
	if len(S)<len(P):
		return False
	next_list = next_list_generate(P)
	match = 0
	flag  = 0
	while flag+len(P)<=len(S) :
		for i in range(len(P)):
			if P[i] == S[flag+i]:
				match += 1
			else:
				flag += match - next_list[i]
				break
		if match == len(P):
			return True
		match = 0
	return False

测试样例:

#instance1
Str = 'freerh'
Pattern = 'erh'
print KMP(Str,Pattern)
#instance2
Str = 'abcd'
Pattern = 'be'
print KMP(Str,Pattern)
#instance3
Str = 'abcdf'
Pattern = 'bcdg'
print KMP(Str,Pattern)

测试输出:

True
False
False

基于python3(python3.8)实现(2020.12.16新增)

def KMP_search(text:str,pattern:str)->bool:
	if len(pattern)>len(text) or len(pattern)==0:
		return False
	def get_next(pattern):
		next_list=[0 for i in range(len(pattern))]
		next_list[0]=-1
		i=-1
		j=0
		while(j<len(pattern)-1):
			if(i==-1 or pattern[i]==pattern[j]):
				i+=1
				j+=1
				next_list[j]=i
			else:
				i=next_list[i]
		return next_list
	next_list=get_next(pattern)
	ti=0
	pi=0
	while ti<len(text):
		if text[ti]==pattern[pi]:
			if pi==len(pattern)-1:
				return True
			else:
				ti+=1
				pi+=1
		elif pi==0:
			ti+=1
		else:
			pi=next_list[pi]
	return False

测试输入:

print(KMP_search('b','b'))
print(KMP_search('bsdfss','bsdfss'))
print(KMP_search('bsdfsa','sa'))
print(KMP_search('b','a'))
print(KMP_search('bsdfsa','ssa'))
print(KMP_search('bsdfsa','bsdfsb'))

测试输出:

True
True
True
False
False
False
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lrs1353281004/article/details/82633619

智能推荐

电商项目面试问题_电商项目面试题_寒夕若梦的博客-程序员宅基地

1.说说你最近做的这个项目的背景,简单的介绍一下你这个项目?背景 电商项目的背景一般是由市场推动的,比如行业竞争或者经营方式的改变(营销理念)。竞争的形态也发生了巨大的变化,从以产品、价格为主的竞争转向以服务为主的竞争,服务成为主导竞争格局的重要因素。渠道作为企业完成客户沟通、产品/服务交换过程以及实现价值、产生效益的重要载体,发挥了采集、传达客户和竞争对手等市场信息,为买卖双方提供..._电商项目面试题

视频类产品直播+录制后端设计实践_blackcop的博客-程序员宅基地

随着最近2年直播类产品大火,越来越多的直播产品进入公众视线,诸如美女直播、新闻直播、教育直播、游戏直播、风景直播等众多繁杂类目的直播产品层出不穷,而这些直播在技术实现上有哪些共通之处,存在什么差异,如何更好的结合场景实现系统功能的完善、稳定、可扩展,都是技术人需要关注和克服的要点。由于之前在青果项目负责后端设计工作的关系,对视频类产品在直播&录制后端设计方面有一些实践和思考,这里做一些阐述和小结。

如何选择合适的高性能计算(HPC)和超算平台_猿代码科技的博客-程序员宅基地

在科学研究、工程设计、大数据分析等领域,高性能计算(HPC)和超算任务越来越重要。选择合适的平台对于保证计算任务的成功执行至关重要。

hbash基本命令与实践_weixin_33720956的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ..._hbash

前端知识点_franky 前端_Frankywls的博客-程序员宅基地

本文旨在加深对前端知识点的理解,资料来源于网络,由本人(博客:http://segmentfault.com/u/trigkit4) 收集整理。一些开放性题目1.自我介绍:除了基本个人信息以外,面试官更想听的是你与众不同的地方和你的优势。2.项目介绍3.如何看待前端开发?4.平时是如何学习前端开发的?5.未来三到五年的规划是怎样的?position的值, re_franky 前端

安装office2010提示错误25541的解决方法-程序员宅基地

转自:http://www.weidianyuedu.com/content/1711990380552.html安装office2010提示错误25541。Failed to open XML fileC:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config error:2147024786。安装office2010提示错误25541的解决方法本文图文详解安装office2010提示错误25541的解决方法。解决方法_错误25541

随便推点

操作系统实验 进程调度 JAVA_java实现时间片轮转进程调度图形化_greenHandRYX的博客-程序员宅基地

问题描述:多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。调度算法:优先权法–动态优先权轮转法程序流程图:编程思路:首先定义进程Thread进程Thread有以下几个属性:name(进程名) 这里就简单的用数字表时进程名runTime(进程..._java实现时间片轮转进程调度图形化

vue-cli · Failed to download repo vuejs-templates/webpack: connect ETIMEDOUT 192.30.253.112:443_Sword-Holy的博客-程序员宅基地

命令行运行 vue init webpack vue-demo 报错:vue-cli · Failed to download repo vuejs-templates/webpack: connect ETIMEDOUT 192.30.253.112:443查了下问题,开始以为是没有安装webpack 然后通过 cnpm install -g webpack ,再运行 vue init webpack vue-demo 还是报错。打开 hosts 文件, 存在 192.30.253.112 g

软件测试岗位职责和划分_胡大大丶的博客-程序员宅基地

前言​ 当下软件测试岗位越来越火,然后很多人对软件测试岗位,和技能都很迷糊,下面浅谈一下当下软件测试岗位和需掌握的技能。一、什么是软件测试​ 很多小伙伴只知道软件测试这个岗位,不明白它到底是什么,软件测试到底是做什么呢?​ 测试(test)最早是出自古拉丁字,它有罐或者容器的含义。在一般的工业生产中,被当做一个常规的检查去做的。而软件测试的经典定义是:在规定条件下,对程序进行操作,以发现错误,对软件质量进行评估。​ 总结:软件测试的初衷就是为了发现软件自身存在的缺陷(BUG),而设定的一

用混合可视化方法探索单元、网络和上下文论文----笔记_exploring units, networks, and context in a blende-程序员宅基地

Graphicle: Exploring Units, Networks, and Context in a Blended Visualization Approachhttp://www.cad.zju.edu.cn/home/vagblog/?p=6692(浙江大学可视化实验室)作者:Timothy Major; Rahul C. Basole发表:InfoVis 2018简介:..._exploring units, networks, and context in a blended visualization approach

腾讯老鸟谈,软件测试的完整流程/过程_腾讯软件测试环境_程序员Baby~的博客-程序员宅基地

其实测试的流程这个描述不够准确,在国际软件测试委员会的大纲《ISTQB认证测试工程师_FL大纲-2018版_V3_1》中,把这个测试的过程和步骤叫做 测试过程(test process )它又牵扯到 测试活动 和 测试策略 的概念国际软件测试认证委员会 2018 版尽管没有统一的软件测试过程,但是有一些常见的测试活动,如果没有这些测试活动就不太可能实现既定的目标。这些测试活动就组成了一个测试过程。在任何给定的情况下,适当的、特定的软件测试过程取决于很多因素。测试过程中涉及哪些测试活动,如何_腾讯软件测试环境

MongoDB的全文索引_mongodb支持中文全文索引_学习Java的小姐姐的博客-程序员宅基地

Table of Contents背景如何使用准备工作:插入数据建立全局索引查询结果使用中存在哪些问题?英文存在停止词中文无法采用全文索引前面了解了多种索引方式,比如单键索引,多键索引,复合索引等,这些感觉都太空,咱今天学习一下实用的索引——全文索引。背景比如我们在慕课中搜索一个内容mongodb,他是在全局搜索,包括课程,猿问,手记等。如果这个时候..._mongodb支持中文全文索引

推荐文章

热门文章

相关标签