KMP算法-字符匹配
字符匹配模式-KMP算法
j直接跳到了2的位置,因为在之前的都相同。
那么就需要求如果不等了之后,j需要回跳的位置next[j]
如果tk'与tj相等,则next [j+1]=k'+1
如果tk‘与tj不相等,则继续向前找,直到找到next[0]=-1为止
注意:t是从0下标开始
- 1 void getnext(string t)
- 2
- 3 {
- 4
- 5 int j=0,k=-1;
- 6
- 7 int len=t.size();
- 8
- 9 next[0]=-1;
- 10
- 11 wihle(j<len)
- 12
- 13 {
- 14
- 15 if(k==-1||t[j]==t[k])
- 16
- 17 next[++j]==++k;
- 18
- 19 else
- 20
- 21 k=next[k];
- 22
- 23 }
- 24
- 25 }
得到next数组之后就可以进行枚举了,当s[i]!=t[j]时,就让j=next[j]然后再次进行讨论。
KMP匹配:
- 1 int KMP(steing s,string t,int pos)
- 2
- 3 {
- 4
- 5 int i=pos,j=0
- 6
- 7 int lens=s.size();
- 8
- 9 int lent=t.size();
- 10
- 11 getnext(t);
- 12
- 13 while(i<lens&&j<lent)
- 14
- 15 {
- 16
- 17 if(j==-1||s[i]==t[j])
- 18
- 19 i++,j++;
- 20
- 21 else
- 22
- 23 j=next[j];
- 24
- 25 }
- 26
- 27 if(j>=lent)//匹配成功,则返回i-lent+1(即为t串出现的位置)
- 28
- 29 return i-lent+1;
- 30
- 31 else
- 32
- 33 return -1;
- 34
- 35 }
另外:
算法优化
当s[i]!=t[j]时,j=next[j]=k,如果t[j]=t[k],就没必要来比较,直接退回到next[k].
代码如下:
- 1 void getnext(string t)
- 2 {
- 3 int j=0,k=-1;
- 4 int len=t.size();
- 5 next[0]=-1;
- 6 wihle(j<len)
- 7 {
- 8 if(k==-1||t[j]==t[k])
- 9 {
- 10 j++,k++;
- 11 if(t[j]==t[k])
- 12 next[j]=next[k];//下一次要跳时就会直接从j跳到next[k];
- 13 else
- 14 next[j]=k;
- 15 }
- 16 else
- 17 k=next[k];
- 18 }
- 19 }
KMP算法-字符匹配的更多相关文章
- KMP算法——字符匹配
暴力匹配: 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置, ...
- KMP算法,匹配字符串模板(返回下标)
//KMP算法,匹配字符串模板 void getNext(int[] next, String t) { int n = next.length; for (int i = 1, j = 0; i & ...
- KMP算法 字符串匹配(看猫片)
前言 此篇笔记根据自己的理解和练习心得来解释算法,只代表个人观点,如有不足请指出(我刚学QWQ) 浅谈字符串匹配 设想一个场景,假设你是一个净化网络语言环境的管理员,每天需要翻阅大量的文章和帖子来查找 ...
- KMP算法——字符串匹配
正直找工作面试巅峰时期,有幸在学校可以听到July的讲座,在时长将近三个小时的演讲中,发现对于找工作来说,算法数据结构可以算是程序员道路的一个考量吧,毕竟中国学计算机的人太多了,只能使用这些方法来淘汰 ...
- KMP算法---字符串匹配
算法细节详见点击打开链接和点击打开链接 #include <stdio.h> #include <stdlib.h> #define N 7 #define M 15 void ...
- HDU-2087 剪花布条 字符串问题 KMP算法 查匹配子串
题目链接:https://cn.vjudge.net/problem/HDU-2087 题意 中文题咯 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条, ...
- 字符串匹配(KMP 算法 含代码)
主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...
- KMP算法-Java实现
目的: 为了解决字符串模式匹配 历程: 朴素模式匹配:逐次进行比较 KMP算法:利用匹配失败得到的信息,来最大限度的移动模式串,以此来减少比较次数提高性能 概念: m:是目标串长度 n:是模式串长度 ...
- KMP算法具体解释(转)
作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...
随机推荐
- pycharm 操作excel
一.安装openpyxl Python中,往excel写入数据通常使用openpyxl库.也可以使用pandas库.这里讲解如何通过openpyxl库操作excel.pip install openp ...
- mumu模拟器使用
连接mumu模拟器 启动mumu模拟器 执行命令:adb connect 127.0.0.1:7555(windows系统推荐使用gitbash) 安装app Gitbash下执行:adb insta ...
- Java安全之 ClassLoader类加载器
Java安全之 ClassLoader类加载器 0x00 前言 前面这里抛出一个问题,Java到底是什么类型的编程语言?是编译型?还是解释型?在这个问题是其实一直都都有疑惑,如果说是解释型语言的话,那 ...
- iMAC_使用相关
MAC软件下载 https://www.macwk.com/ 这是网站是一个下载免费软件的网站,下载通过<天翼云盘>下载,这个天翼云盘下载的快 好用的软件推荐 腾讯柠檬(Tencent L ...
- 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 百篇博客分析OpenHarmony源码 | v41.03
百篇博客系列篇.本篇为: v41.xx 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...
- Ueditor Version 1.4.3.3 SSRF
点以前挖的洞.Ueditor是支持获取远程图片,较为经典的进行限制url请求,但是可以通过DNS重绑定绕过其验证. 代码分析 一般请求的url如下,其中source为数组,值为图片地址: /edito ...
- Spatial Analyst Tools(Spatial Analyst 工具)
Spatial Analyst Tools 1.区域分析 # Process: 以表格显示分区几何统计 arcpy.gp.ZonalGeometryAsTable_sa("", & ...
- 题解 [ZJOI2016]大森林
题目传送门 Description 现在有 \(n\) 棵以 \(1\) 为根的树,每棵树有一个生长节点,有 \(m\) 次操作,每次操作是下面三种中的一个: 在 \(l\sim r\) 的这些树的生 ...
- uoj167 元旦老人与汉诺塔(记忆化搜索)
QwQ太懒了,题目直接复制uoj的了 QwQ这个题可以说是十分玄学的一道题了 首先可以暴搜,就是\(dfs\)然后模拟每个过程是哪个柱子向哪个柱子移动 不多解释了,不过实现起来还是有一点点难度的 直接 ...
- 小白自制Linux开发板 番外篇 一 modprobe加载驱动问题(转载整理)
使用modprobe加载驱动 转载地址:https://blog.csdn.net/qq_39101111/article/details/78773362 前面我们提到,modprobe并不需要指定 ...