算法(6)KMP+trie

KMP:

最浅显易懂的 KMP 算法讲解_哔哩哔哩_bilibili

该视频使用python书写代码,不会python的小伙伴也可以看看了解kmp的大致思路。

问题描述:

kmp:字符串匹配算法,用来找一个长字符串中出现了几次小字符串,并找到小字符串开始的位置

1.暴力匹配:

#include<iostream>

using namespace std;

const int N=100010,M=1000010;

int n,m;// n表示小字符串的长度,m表示长字符串的长度
char p[N],s[M];//p表示小字符串,s表示大字符串




int main()
{
    cin>>n>>p;
    cin>>m>>s;
    
    for(int i=0;i<m;i++)
    {
        int t=i;
        int flag=1;
        for(int j=0;j<n;j++)
        {
            if(s[i++]!=p[j])
            {
                flag=0;
                break;
            }
        }
        if(flag) cout<<i-n<<' ';
        i=t;
    }

    return 0;
}

2.kmp基本思路:(视频01:41)

当发现某一个字符串不匹配时由于已经知道之前遍历过的字符,那么我们就利用这些信息来避免暴力算法中的“回退”步骤        =>        不希望 i 递减(i=t 操作)

3.kmp算法中next数组的功能(视频02:37)

在匹配失败时,会看最后一个与长字符串匹配的字符的数值:next [ j-1 ],比如next [ j-1 ]=2,则直接跳过子串的前2个字符        =>        2表示可以“跳过匹配”的字符个数

4.程序实现:


#include<iostream>

using namespace std;

const int N = 100010, M = 1000010;

int n, m;//n为子长,m为母长
char p[N], s[M];//p为子串,s为母串
int ne[N];

int main()
{
	cin >> n >> p + 1 >> m >> s + 1;

	//求next数组的过程
	//ne的第一的数为0,则i从2开始,i表示开始存哪个数的ne,j表示有多少个相同的字符,p[j+1]表示将和ne[i]匹配的字符
	for (int i = 2, j = 0; i <= n; i++)
	{
		while (j && p[i] != p[j + 1]) j = ne[(j + 1) - 1];
		if (p[i] == p[j + 1]) j++;
		ne[i] = j;
	}


	//KMP匹配过程
	for (int i = 1, j = 0; i <= m; i++)//i遍历母串,j+1遍历子串,j表示要跳过几个字符
	{
		while (j && p[j + 1] != s[i]) j = ne[(j + 1) - 1];//j没有退回起点,且当前的s[ i ]不能和p[j+1]的位置匹配=》更新要跳过的字符
		if (p[j + 1] == s[i]) j++;//匹配,则检查下一个字符
		if (j == n)//匹配成功
		{
			printf("%d ", i - n);
			j = ne[j];
		}
	}
	return 0;
}

trie:

1.概念:

Trie树,又叫字典树前缀树(Prefix Tree)单词查找树键树,是一种多叉树结构。如下图:

一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。

作用:快速储存和查找字符串集合的数据结构

2.代码实现:

创建树,询问树

#include<iostream>

using namespace std;

const int N = 100010;

int son[N][26];//每个子节点最多连26个字母
int cnt[N];//以当前字母为结点的单词有多少个
int idx;//当前用到了那个下标,下标是0的点,既是根节点,又是空节点(给整棵树的每个结点赋予一个全局唯一的编号)
char str[N];

void insert(char str[])
{
	int p = 0;
	for (int i = 0; str[i]; i++)
	{
		int u = str[i] - 'a';
		if (!son[p][u]) son[p][u] = ++idx;//头结点p的儿子中是否有26个字母中的u,没有就新建一个儿子,给他一个id(x)
		p = son[p][u];//更新根节点
	}

	cnt[p]++;//以该结点为结尾的字符串多了一个
}

int query(char str[])
{
	int p = 0;
	for (int i = 0; str[i]; i++)
	{
		int u = str[i] - 'a';
		if (!son[p][u]) return 0;
		p = son[p][u];
	}
	return cnt[p];
}

int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		char op[2];
		cin >> op >> str;
		if (op[0] == 'I') insert(str);
		else cout << query(str) << endl;
	}

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/491985.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu中使用docker对配置文件进行挂载

目录 1.什么是挂载&#xff1f; 2.挂载的好处 3.挂载的方法 4.运行 5.查看 1.什么是挂载&#xff1f; 挂载通常指的是使操作系统能够访问到文件系统的过程。当一个文件系统被挂载到一个目录&#xff08;称为挂载点&#xff09;后&#xff0c;从该目录及其子目录下就可以访…

游戏本续航@控制中心的省电模式效果如何

文章目录 节能模式长续航模式&#x1f47a;相关工具 节能模式长续航模式&#x1f47a; 蓝天模具Control Center中的模式 根据我的试验,以及软件的提示,可以发现 Power Saving是最省电的,儿Quiet模式并不省电,它会启用独立显卡,只不过风扇的转速不像娱乐模式和性能模式那么积极而…

MySQL中使用distinct单、多字段去重方法

目录 一、distinct 1.1 只对一个字段查重 1.2多个字段去重 1.3针对null处理 1.4与distinctrow同义 二、聚合函数中使用distinct 三、CONCAT_WS函数 多个字段拼接去重是指将多个字段的值按照一定的规则进行拼接&#xff0c;并去除重复的拼接结果。这样可以生成唯一标识符…

抖店找达人带货,能赚钱吗?了解达人的这些特征!出单其实很简单

哈喽~我是电商月月 把抖音小店做起来的人都说&#xff0c;抖音小店前期出单最好的方式只有达人带货 那为什么还有那么多新手朋友确实找达人带货了&#xff0c;仍是不赚钱&#xff0c;不出单呢&#xff1f; 原因只有两点&#xff1a; 要么是你的品不好&#xff0c;要么就是你…

YOLOv7 | 注意力机制 | 添加ECA注意力机制

目录 原理简介 代码实现 yaml文件实现&#xff08;tips&#xff1a;可以添加不同的位置&#xff09; 检查是否添加执行成功 完整代码分享 论文创新必备&#xff08;可帮忙做实验&#xff09; 启动命令 ECA是通道注意力机制的一种实现形式&#xff0c;是基于SE的扩展。…

基于工业以太网的电能计量管理系统的应用

摘要&#xff1a;针对目前工业电能模式的研究现状&#xff0c;本文阐述了在现代以太网基础上的电能管理系统的设计。 该系统实现了电能的远程实时监控与管理&#xff0c;并且该系统支持多种终端设备的远程访问&#xff0c;建立了一个实时的人机界面管理平台&#xff0c;实现对电…

Web CSS笔记2

目录 1、背景 ①、背景图片(image) ②、背景平铺&#xff08;repeat&#xff09; ③、背景位置(position) ④、背景附着&#xff08;attachment&#xff09; ⑤、背景透明(CSS3) ⑥、背景图片缩放大小&#xff08;size&#xff09;&#xff1a; ⑦、背景简写 2、标签显…

全国1000米分辨率逐年植被覆盖度(FVC)数据集

本数据集包括2000年至今&#xff0c;全国逐年植被覆盖度数据&#xff0c;FVC范围值为0-1&#xff0c;数据为浮点型&#xff0c;GeoTIFF格式。GeoTIFF文件均可用ArcGIS软件和GDAL读取和打开。 植被覆盖度是指植被&#xff08;包括叶、茎、枝&#xff09;在地面的垂直投影面…

【CXL协议-事务层之CXL.cache (3)】

3.2 CXL.cache 3.2.1 概述 CXL.cache 协议将设备和主机之间的交互定义为许多请求&#xff0c;每个请求至少有一个关联的响应消息&#xff0c;有时还有数据传输。 该接口由每个方向的三个通道组成&#xff1a; 请求、响应和数据。 这些通道根据其方向命名&#xff0c;D2H&…

Llama模型下载

最近llama模型下载的方式又又变了&#xff0c;所以今天简单更新一篇文章&#xff0c;关于下载的&#xff0c;首先上官网&#xff0c;不管在哪里下载你都要去官网登记一下信息&#xff1a;https://llama.meta.com/llama2 然后会出现下面的信息登记网页&#xff1a; 我这里因为待…

【unity】认识unity Hub的主要功能

这里我们主要讲解unity Hub中的【项目】和【安装】功能&#xff0c;其他对应的功能栏相信大家根据文字就可以知道相应的作用。 首先是介绍【项目】功能&#xff0c;在这里我们可以创建本地项目和云端项目&#xff0c;作为初学者我们创建本地项目皆可&#xff0c;当然如果你是多…

fs.1.10 ON CENTOS7 docker镜像制作

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 centos7 docker上编译安装fs1.10版本的流程记录。 环境 docker engine&#xff1a;Version 24.0.6 centos docker&#xff1a;7 freeswitch&#xff1a;v1.10.7 手动模式 centos准备 docker hub拉取centos镜像。…

I/O(输入/输出流的概述)

文章目录 前言一、流的概述二、输入/输出流 1.字节/字符输入流2.字节/字符输出流总结 前言 在变量、数组和对象中储存的数据是暂时的&#xff0c;程序结束后它们就会丢失。如果想要永久地储存程序创建的数据&#xff0c;需要将其保存在磁盘文件中&#xff0c;这样就可以在程序中…

C# 快速将数据写入 Excel 单元格

目录 性能问题 Excel元素结构及写入原理 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 WriteArrayToExcel 神奇的 911 事件 小结 性能问题 将生成或查询到的数据&#xff0c;导出到 Excel 是应用中常用的一项功能。其中一些标准的写入单元格的方法如…

Java与Go:文件IO

在软件开发中&#xff0c;文件IO是一项基本任务&#xff0c;涉及到从文件读取数据、向文件写入数据以及处理文件相关的异常等操作。在这篇文章中&#xff0c;我们将专注于比较两种流行的编程语言&#xff1a;Java和Go&#xff0c;在文件IO方面的异同点。 文件的打开与关闭 文…

uniapp实现单选组件覆盖选中样式

uniapp实现单选组件覆盖选中样式 完整代码&#xff1a; <!-- 是否选择组件: trueOfFalseChooseBtn --> <template><view class"is-true-body"><view class"btn-con" :class"isTrue ? btn-con-active : " click"clic…

Prototype

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网. 题目&#xff1a; 样例&#xff1a; 输入 168 输出 42 思路&#xff1a; 根据题意&#xff0c; 吸收怪物是 w * n &#xff0c;其中 怪物 n 一定是质数&#xff0c;并且 AlexMercer 可以变成 w 的任一因子。 从中…

《安富莱嵌入式周报》第335期:大量嵌入式书籍免费下载,CNC电机同步,智能家居比赛作品,EMF2024电子胸牌,Swift语言单片机编程,UDS Boot

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV151421Q7P4/ 《安富莱嵌入式周报》第335期&#xff1a;大量嵌入…

Python数据分析师工资怎么样?

在大数据时代&#xff0c;提到数据分析&#xff0c;就不得不提到Python&#xff0c;作为一门编程语言&#xff0c;Python用于数据分析时&#xff0c;能够带来很多的优势&#xff0c;这也是Python数据分析师现在受到欢迎的原因。Python数据分析师受到欢迎&#xff0c;相应地能够…

稀碎从零算法笔记Day26-LeetCode:跳跃游戏

断更多天&#xff0c;懒狗ex 题型&#xff1a;数组、模拟、类似双指针&#xff1f; 链接&#xff1a;55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组…