字符串匹配问题(暴力,kmp)
对于字符串的匹配问题,现在自己能够掌握的就只有两种方法,
第一种就是我们常用的暴力匹配法,那什么是暴力匹配法呢?
假设我们现在有一个文本串和一个模式串,我们现在要找出模式串在文本串的哪个位置。
文本串:ABCDABCCDABCY ABCDEDFC
模式串:BCDED
暴力的方法就是我们一个一个匹配;
假设文本串匹配到j,模式串匹配到i;由上面我们可以看到 j=0,i=0;时,
他们不能匹配,那么我们再从j=1;i=0;进行匹配,我们可以看到这是后他们可以匹配。
我们进行操作j++,i++。我们又可以看到又是匹配的,再从进行j++,i++。
直到j=4&&i=3的时候,我们可以看到这两个字符不能匹配,那么我们就要进行操作j++,i=0;
模式串就要从头开始匹配。这样的做法就是当模式串的字符不能与文本串的字符相匹配的时候,
模式串就要重新与文本串匹配。
了解了暴力匹配的方法,下面我们来介绍KMP算法,为什么我们要学习这些算法呢,因为KMP算法在时间比暴力算法要
优化许多。那什么是KMP算法呢,下面我们就来说说这个算法的核心思想。
我们可以看到当文本串匹配到x的时候就匹配失败了,这是我们依然按照暴力匹配的方法进行匹配。
我们还是用j代表文匹配的字符位置,i代表模式串匹配的字符位置。
当我们匹配到j=10,也就是x的时候,i=6,也就是c的时候,这个时候匹配失败了。
按照我们暴力的思路的话我们就得将模式串返回到开头,。而现在我们要用KMP算法来处理。
可以看到,在我画了下划线的地方他们的字符串是一样的,所以当我们下一次匹配的时候就不用将
模式串的i返回到0,可以直接返回到i=2,也就是c的位置,这样我们就得到了下图。
按照这样的方法就可以找到模式串在文本串的位置。
这样的方法我们就必须找到模式串中的前缀后缀最长公共元素长度。
怎样来找这个前缀后缀最长公共元素长度得临时数组,文字叙述我叙述不清楚。
大家看一看下面这个链接的视频,视频将这个方法将的非常的详细;
链接:https://www.bilibili.com/video/av3246487?from=search&seid=5216993177757720410
这个视频将kmp算法讲的非常的通俗易懂,在这里我给出求临时数组的代码,大家可以参考一下;
这个代码是根据上面视频中的求临时数组的方法写的。
这里求的数组并不是很多人讲的next数组,要想求next数组,我们只需要将
我们求的数组的值往后移一位,然后将下标为0的数组对应的值赋为-1即可;
即next[i]=next[i+1]&&next[0]=-1;
讲的比较烂,毕竟是才学会这种算法,很多地方讲解的不是很清楚;
附上大佬讲解的链接:https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html
上面这个链接的博主讲解的KMP算法讲解的十分详细,并且还拓展了两种比kmp算法还快的
的算法,建议大家去看一看,收获一定会很大的。
字符串匹配问题(暴力,kmp)的更多相关文章
- 模式字符串匹配问题(KMP算法)
这两天又看了一遍<算法导论>上面的字符串匹配那一节,下面是实现的几个程序,可能有错误,仅供参考和交流. 关于详细的讲解,网上有很多,大多数算法及数据结构书中都应该有涉及,由于时间限制,在这 ...
- 神奇的字符串匹配:扩展KMP算法
引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T( ...
- PKU 1226 Substrings(字符串匹配+暴搜KMP模板)
原题大意:原题链接 给出n个字符串,找出一个最长的串s,使s或者s的反转字符串(只要其中一个符合就行)同时满足是这n个串的子串. 对于样例,第一组ABCD BCDFF BRCD最长的串就是CD; ...
- FZU 2122——又见LKity——————【字符串匹配、暴力】
Problem 2122 又见LKity Accept: 407 Submit: 1413Time Limit: 1000 mSec Memory Limit : 32768 KB Pr ...
- HDU 1247 Hat’s Words (字符串匹配,暴力)
题意: 给出一堆单词,如果有一个单词可以分成左右串两个单词,并且在所给的一堆单词中存在,就是hat词,统计所有这样的词,并按字典序输出. 思路: 注意定义,一个hat词可以被两部分已经存在的词组成,那 ...
- zstu.4194: 字符串匹配(kmp入门题&& 心得)
4194: 字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 206 Solved: 78 Description 给你两个字符串A,B,请 ...
- 字符串匹配与KMP算法实现
>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个 ...
- 字符串匹配KMP算法详解
1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...
- 【模板】字符串匹配的三种做法(Hash、KMP、STL)
题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 输入输出格式 输入格式: 第一行为一个字符串,即为s1 第二行为一个字符串,即为s2 输出格式: 1行 ...
- KMP字符串匹配 简单理解
http://www.cnblogs.com/c-cloud/p/3224788.html 字符串匹配,长串长度为m,子串长度为n 则,暴力破解的复杂度为o(m*n) 如果用kmp匹配,则复杂度为o( ...
随机推荐
- TestNg依靠先进的采用强制的依赖,并依赖序列的------TestNg依赖于特定的解释(两)
原创文章,版权所有所有,转载,归因:http://blog.csdn.net/wanghantong TestNg使用dependsOnGroups属性来进行依赖測试, 測试方法依赖于某个或某些方法, ...
- SignalR QuickStart
原文:SignalR QuickStart SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限 ...
- 生成wsdl代理c#代码
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\wsdl.exe /l:CS /out:d:\ws ...
- 给文件右击菜单增加7-ZIP浏览功能(用注册表设置Shell调用预览命令)
疯狂delphi delphiXE7.XE8.XE10公开课A 群号:58592705 QQ:513187410 朱建强 BAT-给文件右击菜单增加7-ZIP浏览功能 Reg给文件右击菜单增加7-ZI ...
- IIS 设置文件可下载
IIS遇到了文件不能下载的问题.为了让IIS能下载扩展名是INI的文件,我们需要如此操作:(括号内的是英文版本的名字) 打开“IIS管理器(InternetInformationServices(II ...
- Android卡片设置透明度失效问题
最近在做蓝牙电话项目,需要支持双路通话,涉及到通话卡片透明度调节,当正在通话中,有新的来电时,原来的通话卡片需要做成30%的透明度,本来很简单的一个小改进,但通过 setAlpha()接口总是失效! ...
- 在Delphi中关于UDP协议的实现
原文地址:在Delphi中关于UDP协议的实现作者:菜心 首先我把UDP无连接协议的套接字调用时序图表示出来 在我把在Delphi中使用UDP协议实现数据通讯收发的实现方法总结如下: 例子描述:下 ...
- CMake编译Widget UI Qt程序
自从CMake被引入到KDE项目的编译系统中后,CMake的使用者日益增多,Qt也不例外,除了使用QMAKE编译Qt程序外,也可以使用CMake来编译Qt程序,并且CMake在使用上更灵活,特别是大型 ...
- iOS11中iOS处理GIF图片的方式
GIF 五部走如下 : 1 从相册中取出GIF图的Data 2 通过腾讯的IM发送Gif图 3 展示GIF图 4 GIF图URL缓存机制 5 将展示的GIF图存到相册中 一 从相册中 ...
- SYN1618型 高精度天文时间同步系统
SYN1618型 高精度天文时间同步系统 产品概述 SYN1618型 高精度天文时间同步系统是由西安同步电子科技有限公司精心设计.自行研发生产的一款高精度的时频频率标准设备,接收GPS.GLON ...