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算法,只有在解 ...
随机推荐
- Jmeter系类(31) - JSR223(1) | 控件介绍
JSR233 介绍 JSR223控件执行JSR223脚本代码用于创建/更新所需的某些变量 JSR223可以使用其内置的变量,有助于精简脚本,提高开发测试的效率 由于JSR223脚本编译方式基本相同,J ...
- Fiddler抓包工具-全网最全教程,没有之一
初识Fiddler fiddler,译为骗子 是位于客户端.服务器端的HTTP代理,是Web调试的利器. 是c#编写的程序 Fiddler主要功能: 监控http.https流量 查看.分析请求内容细 ...
- WPF进阶技巧和实战03-控件(5-列表、树、网格03)
数据视图 数据视图是在后台工作的,用于协调绑定数据的集合.使用数据视图可以添加导航逻辑.实现数据过滤.排序.分组. 当将集合或者DataTable绑定到ItemsControl控件时,会不加通告地在后 ...
- redis无法连接
Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redi ...
- Ubuntu-mate-20.04-desktop安装总结
ubuntu-mate-20.04-desktop效果先展示下: Ubuntu用MATE桌面环境同时配合compiz 窗口管理器是目前为止得到的桌面中最喜欢的样式 一.ubuntu-mate官网下载i ...
- robot framework使用SeleniumLibrary打开谷歌浏览器无头模式
注:我百度了一圈并没有发现类似的教程 robot framework的seleniumLibrary一般打开浏览器的方式是用关键字 Open Browser 但是,阅读seleniumLibrary ...
- mysql int(3)与int(10)的数值范围相同吗?
提问: mysql的字段,unsigned int(3), 和unsinged int(6), 能存储的数值范围是否相同.如果不同,分别是多大? 回答: 不同,int(3)最多显示3位无符号整体,in ...
- PowerDotNet平台化软件架构设计与实现系列(02):数据库管理平台
为了DB复用和简化管理,我们对常见应用依赖的DB模块进行更高级的提取和抽象. 虽然一些ORM可以简化DB开发,但是我们还是需要进行改进和优化,否则应用越多,后期管理运维越混乱. 根据常见开发需要,数据 ...
- CSS写一个圣诞树Chrome浏览器小插件
一时兴起,突然想写一个Chrome浏览器插件,不知道写啥,就写了一个圣诞树小插件.项目源码>> Chrome浏览器插件 Chrome浏览器插件最主要的是:index.html.manife ...
- 搭建Mac+Java+appium+IOS真机自动化环境
一.安装前环境准备 1.确保电脑已经有homebrew(包管理器) 下载链接[https://brew.sh/] 2.通过 brew 安装node.js brew install node 安装 ...