当前位置: 首页 > news >正文

kmp模式串匹配

大二的时候百度看不懂,现在大三下学期了百度也看不懂。(实在是不能理解这个next数组究竟是怎么样工作的,为什么会得出那样的结果。)如果有好心人知道的话希望可以联系我告诉我(邮箱:4609019410@qq.com)

作用:字符串匹配

我们设匹配串为t,待匹配串为s,这个算法的功能就是在指定s中,从s的第i位字符开始搜索,判断在s中是否有t存在。

                            如果有则返回出现了t的首位字符位置(当然,这个数组是从0开始),如果没有则返回0。

通过next数组对匹配串t进行一个预处理,我们获得一个next数组。

下面的描述:string t:从0开始,next[]:从1开始

       i=1;

       这个next数组的意义是:对于我们要处理的字符串t里的第(i-1)字符对应的每一个next[i]元素

                                       next[i]保存的是:从t[0]开始到t[i-1]的这一段字符串所有前缀与后缀的最大匹配长度

    next在kmp算法里发挥的作用:在每一次的匹配中,当碰上失配的情况(我们设初始态:t[0]与s[pos]开始比较,如果相等则两个指针同步增加变量。假设加到j时失配,即s[pos+j]!=t[j])

                                             我们可以利用next数组存储的信息,让它加速前进(而不是像朴素的模式匹配算法那样一位一位地挪,又从t[0]开始与s[pos],提高匹配效率。)

几番周折还是弄不懂究竟是怎么运作的,所有只好先把实现的放上来,以后在琢磨是怎么回事了。以后弄明白了再回来说。。

#include<iostream>
#include<cstring>
using namespace std;
void get_next(string t,int *next)
{
	int i=1,j=0;
	next[1]=0;
	while(i<t.length())
	{
		if(j==0||t[i]==t[j])
		{
			i++;j++;
			next[i]=j;
		}
		else j=next[j];
	}
}
int index_KMP(string s,string t,int pos)
{
	int i=pos-1;
	int j=0;
	int next[255];
	get_next(t,next);
	//for(int i=1;i<=t.length();i++){
        //cout<<next[i]<<" ";
	//}
	//cout<<endl;
	while(i<s.length()&&j<t.length())
	{
		if(j==0||s[i]==t[j])
		{i++;j++;}
		else j=next[j];
	}
	if(j>=t.length())
	return i-t.length();
	else return 0;
}
int main()
{
	string a,b;
	cin>>a>>b;
	int w;
	cin>>w;
	int ans=index_KMP(a,b,w);
	cout<<ans<<endl;
	return 0;
}

  

 

转载于:https://www.cnblogs.com/AKsnoopy/p/6572914.html

相关文章:

  • java 面向对象 — 多态
  • Java容器-引用分类与部分Map用法
  • 在Kotlin编写RecyclerView适配器(KAD 16)
  • web-app 与本地app的区别
  • JS 面向对象例题
  • Idea中的插件-列出Java Bean的所有set方法
  • JavaScript的数据类型与变量
  • Android 权限的实现
  • 看《神探夏洛克》经典台词
  • 挂载硬盘,并分区格式化
  • JavaScript中的对象
  • 用vs2015 编译 web app ionic
  • HTTP访问控制(CORS)
  • 02_SimpleTrigger
  • gbdt调参的小结
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2017-08-04 前端日报
  • Android交互
  • Bytom交易说明(账户管理模式)
  • create-react-app做的留言板
  • CSS中外联样式表代表的含义
  • github指令
  • MD5加密原理解析及OC版原理实现
  • React-redux的原理以及使用
  • SSH 免密登录
  • 从tcpdump抓包看TCP/IP协议
  • 大快搜索数据爬虫技术实例安装教学篇
  • 基于web的全景—— Pannellum小试
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 理清楚Vue的结构
  • 前端临床手札——文件上传
  • 如何合理的规划jvm性能调优
  • mysql面试题分组并合并列
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​【已解决】npm install​卡主不动的情况
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #include<初见C语言之指针(5)>
  • #控制台大学课堂点名问题_课堂随机点名
  • (2)STL算法之元素计数
  • (23)Linux的软硬连接
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (SpringBoot)第七章:SpringBoot日志文件
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (三)elasticsearch 源码之启动流程分析
  • (实战篇)如何缓存数据
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET建议使用的大小写命名原则
  • @requestBody写与不写的情况
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [2016.7 test.5] T1
  • [AX]AX2012 SSRS报表Drill through action