KMP算法心得

KMP算法个人心得 个人在学习KMP算法中的一些理解,做个记录 阅读详情

学了这个算法,思路倒是不难懂,但是看了代码后却很绕,特别晕,一直有一个地方不太懂,现在才颇有感受。

next[0]为什么要赋值-1,以及这样的话char数组与next不就不对应了吗?

比如a[3]对应的next数组便是next[4],但是跳跃的时候却是用next[3]

直到后来我准备自己实施代码时发现上面的做法太棒了

举个例子

数组1              :      a b c a b y x

对应的next数组:-1 0 0 0 1 2 0 0 

数组2               :abcabcabyx

如图,当对应到第5个元素时(对应数组的下标),数组1为y,数组2为c,不匹配,于是第一个数组的下标j = next[j],即j = next[5] = 2,所以第一个数组下标就跳到第2个元素,也就是c了,c再与数组2的c匹配,完美!

如果不加上next[0] = -1会变成怎么样?那么每次匹配不成功,必须j = next[j-1],而且无法判断是否已经回到了首元素。


附上刚刷的一道例题:

Oulipo
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 46057 Accepted: 18369

Description

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book:

Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis surgissait l’inhumain, l’affolant. Il aurait voulu savoir où s’articulait l’association qui l’unissait au roman : stir son tapis, assaillant à tout instant son imagination, l’intuition d’un tabou, la vision d’un mal obscur, d’un quoi vacant, d’un non-dit : la vision, l’avision d’un oubli commandant tout, où s’abolissait la raison : tout avait l’air normal mais…

Perec would probably have scored high (or rather, low) in the following contest. People are asked to write a perhaps even meaningful text on some subject with as few occurrences of a given “word” as possible. Our task is to provide the jury with a program that counts these occurrences, in order to obtain a ranking of the competitors. These competitors often write very long texts with nonsense meaning; a sequence of 500,000 consecutive 'T's is not unusual. And they never use spaces.

So we want to quickly find out how often a word, i.e., a given string, occurs in a text. More formally: given the alphabet {'A', 'B', 'C', …, 'Z'} and two finite strings over that alphabet, a word W and a text T, count the number of occurrences of W in T. All the consecutive characters of W must exactly match consecutive characters of T. Occurrences may overlap.

Input

The first line of the input file contains a single number: the number of test cases to follow. Each test case has the following format:

  • One line with the word W, a string over {'A', 'B', 'C', …, 'Z'}, with 1 ≤ |W| ≤ 10,000 (here |W| denotes the length of the string W).
  • One line with the text T, a string over {'A', 'B', 'C', …, 'Z'}, with |W| ≤ |T| ≤ 1,000,000.

Output

For every test case in the input file, the output should contain a single number, on a single line: the number of occurrences of the word W in the text T.

Sample Input

3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN

Sample Output

1
3
0


题意:

找出第一个字符串在第二个字符串中出现次数。


附上AC代码:

#include <cstdio>  
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <stack>
#include <queue>
using namespace std;
#define ll long long
char a[11111];
int next[11111];
char b[1111111];
int lena;
int lenb;
int sum = 0;
void getnext()
{
	int i,j;
	next[0] = j = -1;
	i = 0;
	while(i < lena)
	{
		while(j != -1 && a[i] != a[j])
			j = next[j];
		next[++i] = ++j;
	}
}
void kmp()
{
	int i,j;
	j = 0;
	i = 0;
	while(i < lenb)
	{
		while(j != -1 && a[j] != b[i])
			j = next[j];
		i++;j++;
		if(j >= lena)
		{
			sum++;
			j = next[j];
		}
	}
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		sum = 0;
		scanf("%s%s",a,b);
		lena = strlen(a);
		lenb = strlen(b);
		getnext();
		kmp();
		/*for(int i = 0;i <= len;i++)
			cout << next[i] << ' ';
		cout << endl;*/
		printf("%d\n", sum);
	}
	return 0;
}

LabVIEW面向对象编程:操作者框架入门实战 本文是LabVIEW面向对象编程中操作者框架的入门实战指南。针对传统“面条式代码”在复杂项目中的维护难题,文章通过创建操作者、定义消息与处理函数、在主VI中调用等步骤,详细演示了如何利用操作者框架构建模块化、易扩展的应用程序架构,有效管理并行任务。 阅读详情

相关推荐

OpenCV形状检测

开始定义我们的ShapeDetector类。我们将跳过这里的init构造函数,因为不需要初始化任何东西。#导入必要的包importcv2classShapeDetector#初始化形状名称并近似轮廓shape="unidentified"peri=cv2.arcLength(c,True)approx=cv2.approxPolyDP(c,0.04*peri,True)我们的检测方法,它只需要一个参数c,即我们试图识别的形状的轮廓。...

weixin_43229348的博客 9424

KMP算法讲解与实现

KMP算法的讲解与实现

明朗晨光的专栏 1971

CSS字体样式全攻略

🧱 让文字有空间感,适合标题或LOGO。🖋️适合插画、创意工作者的个人页面。🔥 适合标题、品牌名,视觉冲击力强。🧘‍♀️适合极简设计、文化类网站。✨适合科技类网站、博客、作品集。🚀适合游戏、AI、科技类项目。🐰 适合儿童类网站或节日氛围。📖适合时尚、生活方式类内容。🌫️ 适合神秘、梦幻主题。🌃 夜店风、科技感十足。具体效果是文字会上下跳动。

dreams_dream的博客 1806

KMP算法简介——附代码解析

KMP算法是由一个问题而引发的:对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),默认N≥M。如果 match 是 str 的子串,请返回其在 str 第一次出现时的首字母下标,若 match 不是 str 的子串则返回 -1 。 子序列:可以连续,也可以不连续,比如ac1de,abc123 子串/子数组:必然连续 二者有时候是混用的! getIndexOf 方法: 即getIndexOf (str1,str2)返回一个整型 若match 是 str 的子串,返回其在 str 第

Mr_zhang66的博客 436

详解相机的sensor工作原理

目录sensor成像原理拜尔马赛克变换(BAYER DEMOSAICING)维伦阵列摩尔纹 sensor成像原理 相机或摄像头使用数百万个微小的光腔(感光元件)来记录图像。 成像时,sensor将镜头投射来的光子储存为模拟电信号。 曝光完成后,相机关闭这些光腔(感光元件),然后通过测量模拟电信号的强度来评估每个腔中有多少光子掉入来计算数字电信号的数值。 然后模拟电信号转换为数字电信号,数字电信号的数值由位深度决定(RGB的位深度)。 最后,根据正在记录的文件格式(8位JPEG位0-255),可能会再次降低

路人coder 2万+

深信服PT1-AF实验考试

深信服PT1-AF实验考试实验练习可以去深信服的在线实验平台(链接如下):深信服在线实验平台 (sangfor.com.cn)实验考试其实就是把所有的每一部分实验综合了起来以下内容仅做参考,不确保一样。

m0_72019240的博客 7116

Kmp算法

KMP算法:KMP算法是由Knuth,Morris,Pratt三位学者研究出的模式匹配算法,大大的避免了重复遍历的情况。 算法目的:确定主串中所含子串第一次出现的位置。   在这之前呢,有一个BF算法 (~暴力匹配~)。&gt;_&lt; BF算法设计思想: 1,将主串的第pos个字符和模式的第1个字符比较,     2,若相等,继续逐个比较后续字符; 3,若不等,从主串的下一字符(...

小仙女的博客 438

Keil5编译报错:ARM Compiler Version 5缺失的完整解决方案

本文提供了Keil5编译报错“ARM Compiler Version 5缺失”的完整解决方案。详细介绍了手动安装ARM Compiler Version 5的步骤,包括下载安装包、配置编译器路径及常见问题排查,帮助开发者快速恢复老项目的编译环境。

bb456的博客 945

KMP算法详解

KMP算法 KMP算法用于串的模式匹配 设主串为 text,模板串为 str 若匹配成功返回该模板串首次出现在主串的下标,若失败则返回 -1 暴力解法 i_t 为主串比较的下标 i_s 为模板串比较的下标 若某次该位置匹配成功,主串和模板串的比较位置都置为下一位;若 i_s到达边界,则匹配成功,退出循环 若匹配失败,模板串比较位置退回到起始位置,即 i_s = 0 ,所以 i_s 也是已经匹配成功的长度;主串比较位置改为上一轮开始比较位置的下一位置,相当于主串整体前移一位,即为 i_t = i_t -

XiDieccc的博客 262

用C#和MQTTnet在WinForm里做个简易物联网监控后台(附完整源码)

本文详细介绍了如何使用C#和MQTTnet库在WinForm中构建一个简易物联网监控后台。通过实战案例,包括环境配置、MQTT服务端实现、客户端监控功能及高级优化技巧,帮助开发者快速搭建高效的物联网监控系统,适用于工业自动化和智能家居场景。

weixin_29540599的博客 393

基于知识图谱的农作物病虫害问答系统设计与实现

基于规则的问题分类是自问答系统诞生以来就一直存在的方式,主要代表就是众多的专家系统,构建专家系统采用的是规则分类器,优点是能够对特定领域、特征明显的问题进行高效精准问答,但是。,在问答系统中,问题以语音及文本字符等自然语言形式输入,利用问答系统的内部的逻辑处理模块,通过自然语言处理技术获得输入问句的详细语义信息,再经过知识检索、置信分析等步骤,自然语言处理中,用于文本分类任务的机器学习方式有两种,一种用传统的机器学习,如 NBC、SVM 等,另一种采用深度学习,如 CNN 和 RNN 等。

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2166

KMP算法

KMP模式匹配 一、引言 模式匹配问题是指:寻找目标串 s 中与模式串 p 完全相同的子串。 初遇这个问题,我们都能想到用暴力循环的方法进行解决 int violence(char *s , char *p) //s中包含p返回第一次出现位置的下标,否则返回-1 { int slen = strlen(s); int plen = strlen(p); for (int i = 0 ...

qq_43575926的博客 200

Linux ARM平台开发系列讲解(网络篇)1.3 MDIO总线设备device和设备driver匹配

在设备和驱动都载入内核后,设备和驱动是如何匹配起来的呢?其实他们就是通过的唯一标识phyID进行匹配phy_dev和phy_drv是通过phy_bus_match函数进行匹配,匹配成功后会建立链表链接,具体流程如下图: 返回总目录......

DSMGUOGUO的博客 1098

关于KMP算法的心得

最近在重新回顾算法部分,刚好看到KMP算法,把自己的一些理解记录下来。 KMP算法的核心,是一个被称为部分匹配表(Partial Match Table)的数组。我觉得理解KMP的最大障碍就是很多人在看了很多关于KMP的文章之后,仍然搞不懂next中的值代表了什么意思。这里我们抛开所有的枝枝蔓蔓,先来解释一下这个数据到底是什么。 对于字符串“abcabex”,它的next如下表所示: 就像例子中所示的,如果待匹配的模式字符串有8个字符,那么next就会有8个值。 我先解释一下字符串的前缀和后缀。如果字符串

CSK的博客 704

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

KMP算法的一点心得

KMP算法 KMP算法最重要的就是得到 next 数组,以 next[j]=k 为例,在KMP算法里next数组的意思是下标为 j 的字符失配时模式串要后移到k的位置重新开始比较,在求 next 数组的过程中,我们也可以理解为是前 j 个字符中前缀和后缀的相等的最大长度。 void get_next(string str,int next[]) { int j=0,k=-1; next[0]=-1; while(j<str.length()) { if(k==-1||str[j]==str

weixin_43301565的博客 266

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

kmp算法的一点心得

最近学习了kmp算法,看了b站几个讲解视频,感觉最后还是差点意思,最后还是自己在草稿本上涂涂画画 做了多次实验才总结出了道理,在此记录下来,以便以后复习 1。建议结合b站视频up主“正月点灯笼”的视频学习,思路非常清晰,动态规划就是和他学的!视频连接(20分钟左右) 2.最长公共前缀表 比如字符串:ABABAB 有前缀 A AB ABA ABAB ABABA 这五个前缀,都有对应的最长公共前后缀(...

weixin_43842467的博客 429

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

kmp算法心得

最近刚看了KMP算法,就是一种字符串匹配。给你一个主串,给你一个串,让你找出他的子串的位置。 一般的方法:给你一个主串:asdasdasdasdasgd 给你一个匹配串:dasdasg让你求出和匹配串相同的主串的位置。此时我们想到的是从第一个字母开始遍历,当遇到和匹配串第一个字母相同的字母时就开始往后面匹配。当遇到不相同的时候,从开始匹配的那个字母后面开始匹配。这样的话每一次都往后移了很多。 ...

weixin_30357231的博客 122

KMP算法心得总结

KMP算法精髓在于next数组上: 1.next[]数组的定义。对于字符串s的第i个字符s[i],next[i]定义为字符s[i]前面最多有多少个连续的字符和字符串s从初始位置开始的字符匹配 。 因此,对next数组实行逆序跳转输出,可得到 POJ-Seek the Name, Seek the Fame 此题答案 2.S的长度为len,S存在循环子串,当且仅当,len可以被len - ne

GDUFE_SSS 1105

KMP算法的心得体会

kmp算法

2301_79215597的博客 244

KMP算法的学习心得

今天看了半天的KMP算法,算法看完后不是很难,但是觉得,为什么knute能想到,我为什么想不到呢,所以把ouKMP算法琢磨了半天,首先应该想到的有:我们必须利用曾经得到的信息。当模式匹配时,主字符串并不需要回指针,而只需要将模式的往右移动,但问题是,往右移动距离怎么算,这其实不难想到,当模式的第j个字符与主串中的第i个字符不等时,我们得到的数据有前j-1个,可以充分利用这个信息。假设往右移

peter1_jiang的专栏 680

js实现kmp算法_KMP算法学习心得

KMP算法是用来计算在某个字符串中是否包含另一个字符串的,其实就是leetcode28这种问题,这种问题也可以用暴力法进行解决,但是数据量越大,暴力法用的时间越长,毕竟KMP算法时间复杂度为O(m+n), 而暴力法的时间复杂度为O(m*n)。首先介绍下暴力法的代码:#include <iostream> #include<ctime> using namespace std...

weixin_39581739的博客 166

KMP算法学习心得

本文为本人KMP算法学习心得,介绍了KMP的作用,原理等

weixin_74952982的博客 590
上一篇: KMP算法例题+总结
下一篇: 最长公共子序列(LCS)
MMMMMMMW
博客等级 码龄9年 34粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值