串的模式识别和kmp算法

2023-05-16

串的简单模式匹配 与 KMP-获取next数组

参考书籍-王道-数据结构--代码验证软件:vs2019

#include <iostream>
typedef char* SString;
//暴力比对
//S  abcabaaabaabcac
//T  abaabcac
int Index(SString S, SString T)
{
	int i = 1, j = 1;
	while (i <= S[0] && j <= T[0])
	{
		if (S[i] == T[j])
		{
			++i, ++j;//继续比较后续字符
		}
		else {
			i = i - j + 2; j = 1;//指针后退重新开始匹配
		}
	}
	if (j > T[0]) return i - T[0];//匹配成功
	else return 0;
}
//i游标,遍历T
void get_next(char T[], int next[])
{
	int i = 1;
	next[1] = 0;//恒为零
	int j = 0;
	//abaabcac
	while (i < T[0])//T[0]中记录了字符串的长度
	{
		if (j == 0 || T[i] == T[j])//j==0,说明再次回到了开头
		{
			++i; ++j;
			next[i] = j;//记录出现重复的位置
		}
		else {
			j = next[j];//不相同,找个位置重新比较
		}
	}
}
//S  abcabaaabaabcac
//T  abaabcac
int KMP(char S[], char T[], int next[], int pos)
{
	int i = pos;//开始查找的起始位置
	int j = 1;
	while (i <= S[0] && j <= T[0])
	{
		if (j == 0 || S[i] == T[j]) {//相等各自加加,往后走
			++i;
			++j;
		}
		else//不等,就回退next[j]的位置
			j = next[j];
	}
	if (j > T[0])//说明比对成功
		return i - T[0];
	else
		return 0;
}
//简单模式匹配 与  KMP
int main()
{
	//字符串进行初始化
	char S[256];
	char T[10];
	int next[10];
	int pos;
	S[0] = strlen("abcabaaabaabcac");//strlen里有多少个字符
	strcpy(S + 1, "abcabaaabaabcac");
	T[0] = strlen("abaabcac");
	strcpy(T + 1, "abaabcac");
	pos = Index(S, T);
	if (pos)
	{
		printf("匹配成功,位置为%d\n", pos);
	}
	else {
		printf("未匹配\n");
	}
	get_next(T, next);
	pos = KMP(S, T, next, 1);
	if (pos)
	{
		printf("匹配成功,位置为%d\n", pos);
	}
	else {
		printf("未匹配\n");
	}
	system("pause");
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串的模式识别和kmp算法 的相关文章

  • 数据结构串的基本操作及KMP算法

    将串的基本操作C语言实现 xff0c 实现KMP算法算出NEXT函数和NEXTVAL的值 SqString h的基本内容 span class hljs keyword typedef span span class hljs keywor
  • JAVA代码实现字符串匹配(一)——BF、KMP

    话不多说 xff0c 直接进入主题 xff1a 题目描述 xff1a 给定两个字符串text和pattern xff0c 请你在text字符串中找出pattern字符串出现的第一个位置 xff08 下标从0开始 xff09 xff0c 如果
  • 从头到尾彻底理解KMP(2014年8月22日版)

    从头到尾彻底理解KMP 作者 xff1a July 时间 xff1a 最初写于2011年12月 xff0c 2014年7月21日晚10点 全部删除重写成此文 xff0c 随后的半个多月不断反复改进 后收录于新书 编程之法 xff1a 面试和
  • KMP算法

    一 何谓模式串匹配 模式串匹配 xff0c 就是给定一个需要处理的文本串 xff08 理论上应该很长 xff09 和一个需要在文本串中搜索的模式串 xff08 理论上长度应该远小于文本串 xff09 xff0c 查询在该文本串中 xff0c
  • [week15] C - ZJM与纸条(选做)—— KMP算法

    文章目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM
  • 【Week15作业 C】ZJM与纸条【KMP】

    题意 xff1a ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM 送生日礼物 ZJM 想知道自己收到的礼物是不是就是她送的
  • 9.KMP算法

    KMP算法 1 KMP算法解决的问题 字符串str1和str2 xff0c str1是否包含str2 xff0c 如果包含返回str2在str1中开始的位置 xff0c 如果不包含返回 1 如果做到时间复杂度O N 完成 xff1f 测试用
  • Simpsons’ Hidden Talents【KMP模板题】

    Homer Marge I just figured out a way to discover some of the talents we weren t aware we had Marge Yeah what is it Homer
  • 剪花布条 【HDU - 2087】【KMP模板题】

    KMP教学链接 不懂的可以在线问 题意 2个字符串A B 问A中有多少个字符串B Input 输入中含有一些数据 分别是成对出现A B A和B不会超过1000个字符 如果遇见 字符 则表示测试结束 Output 输出B的个数 每个结果之间应
  • KMP算法之基础思想篇

    KMP算法是快速求字符串P 是不是字符串S的子串的一个算法 具体案例呢 可以看力扣的28题 实现 strStr 题意也很简单 就是找出P在S中出现的第一个位置 实际上就是找子串 这种最简单的方法就是暴力 直接两层for循环 O n m 的复
  • 使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发

    使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile KMM 开发 文章中探讨了 Google 提供的应用架构指南在多平台上的实现 通过共享视图模型 View Models 和共享 UI 状态 UI St
  • 求字符串可匹配的最大长度

    如 text abcdlijkfgd query abcdefg 最大匹配为 abcd 为4 编写一个函数 求字符串可匹配的最大长度 如果是完全匹配 则用很多种方法 如BF KMP sunday等字符串匹配算法 KMP是比较常见的 其思想也
  • 数据结构中Java实现KMP与BF算法对比

    public class KMPANDBF public int indexBfCount SeqString s SeqString t int begin int slen tlen i begin j 0 int count 0 sl
  • leetcode 028.实现strStr(),即查找重复字符串(KMP算法)

    前言 本题是经典的字符串单模匹配的模型 因此可以使用字符串匹配算法解决 常见的字符串匹配算法包括暴力匹配 Knuth Morris Pratt 算法 Boyer Moore 算法 Sunday 算法等 本文 前言 本题是经典的字符串单模匹配
  • LeetCode 1967. 作为子字符串出现在单词中的字符串数目(BM、KMP)

    给你一个字符串数组 patterns 和一个字符串 word 统计 patterns 中有多少个字符串是 word 的子字符串 返回字符串数目 子字符串 是字符串中的一个连续字符序列 示例 1 输入 patterns a abc bc d
  • BF,KMP,BM三种字符串匹配算法性能比较

    三种最基本的字符串匹配算法是BF KMP以及BM BF算法是最简单直接的匹配算法 就是逐个比较 一旦匹配不上 就往后移动一位 继续比较 所以比较次数很都 关于KMP和BM的详细介绍可以参考下面的两个link 是讲得比较好的 KMP http
  • Oulipo

    点击打开链接 Problem Description The French author Georges Perec 1936 1982 once wrote a book La disparition without the letter
  • Period 【HDU - 1358】【KMP求周期】

    学习KMP算法可以参阅这篇文章 不懂的可以在线回答 题目链接 题意 我们想知道一串字符中的前缀中有多少最大周期数 例如 aaa 中 前两个 aa 最小周期长度为 a 所以周期长度为2 前三个 aaa 的最小周期也是 a 所以周期长度为3 再
  • Count the string【KMP】

    It is well known that AekdyCoin is good at string problems as well as number theory problems When given a string s we ca
  • SDUTOJ KMP简单应用 【KMP】

    KMP简单应用 Time Limit 1000MS Memory limit 65536K 题目描述 给定两个字符串string1和string2 判断string2是否为string1的子串 输入 输入包含多组数据 每组测试数据包含两行

随机推荐

  • 推荐8本高质量的Python书籍,初学者必看

    Python是一种多功能语言 它经常用作Web应用程序的脚本语言 xff0c 嵌入到软件产品中 xff0c 以及人工智能和系统任务管理 它既简单又强大 xff0c 非常适合初学者和专业程序员 今天 xff0c 小千选择几本高质量的Pytho
  • 更换Win10内置ubuntu18.04编译应用代码 填坑小结

    首先使用Win10内置ubuntu18 04 xff0c 主要是微软商店下载ubuntu18 04 xff0c 然后本电脑开启开发者选项 xff0c 然后勾选linux xff0c 系统就会默认安装Ubuntu系统 xff0c 内置ubun
  • HTTP之ARM编程(在imx6ul上实现http协议通讯)

    首先 xff0c 简单介绍基于HTTP协议的客户 服务器模式的信息交换过程 xff0c 它分四个过程 xff08 建发响关 xff09 xff0c 建立连接 发送请求信息 发送响应信息 关闭连接 在WWW中 xff0c 客户 与 服务器 是
  • 直接上干货!为什么Flutter能最好地改变移动开发?成功拿下大厂offer

    前言 这里整理的是一些与技术没有直接关系的面试题 xff0c 但是能够考察你的综合水平 xff0c 所以不要以为不是技术问题 xff0c 就不看 xff0c 往往有时候就是这样一些细节的题目被忽视 xff0c 而错过了一次次面试机会 想要成
  • Gson 用户指南(中文)

    整体概括 Gson 是一个将Java对象转换成Json字符串 xff0c 将Json字符串转换陈成Java对象的工具库 Gson能够处理任何类型的Java对象 xff0c 甚至包括那些你没有源代码的Java类 不了解对象的属性 Gson能干
  • shell脚本编程

    导语 xff1a shell 就是一个用户跟操作系统之间的一个命令解释器 Linux Shell 种类非常多 xff0c 不同的 Shell 语言的语法有所不同 xff0c 所以不能交换使用 最常用的 shell 是 Bash xff0c
  • 认识函数strok()--eg.分解保存读到的IP配置

    strtok 函数详解 xff01 1 定义 分解字符串为一组字符串 s为要分解的字符 xff0c delim为分隔符字符 xff08 如果传入字符串 xff0c 则传入的字符串中每个字符均为分割符 xff09 首次调用时 xff0c s指
  • Win10 Ubuntu子系统(内嵌ubuntu18.04)运行32bit Linux原生程序 解决Exec format error错误

    一 缘由 电脑重装后 xff0c 重装arm板的开发环境 xff0c win10有内嵌linux环境非常好用 xff0c 就用上了 安装正常流程进行安装 xff1a 1 下载压缩包文件 xff1a arm none linux gnueab
  • eclisp安装 过程 问题 小结

    安装过程 1 下载 安装eclisp xff0c 根据自己电脑版本 xff0c 下载对应版本 jdk版本和对应的eclise版本 xff08 64位 jdk对应64位的eclise xff0c 很关键 xff01 xff09 java jd
  • shell-服务监控 系统检查脚本 小结

    告警监控服务的要点 xff1a 查看某个进场是否启动的方式 xff1a 举例子 xff1a 案例 磁盘报警高级脚本 脚本分析 xff1a 1 磁盘达到85 发送报警邮件 2 发送邮件命令格式 3 多个报警设置 4 把分区的信息写入文件 Ma
  • Linux环境下对Cmake的版本快速更新

    本文将介绍一种在Ubuntu系统下快速升级CMake到指定版本的方法 之前找了很多方法 xff0c 要么需要删除原来的版本 xff0c 如果安装不成功会非常危险 xff0c 之前的编译环境都没了 另外就是ppa的更新 xff0c 我试了也不
  • APDU指令返回码及其代表含义

    APDU指令返回码及其代表含义 9000 正常 成功执行 6200 警告 信息未提供 6281 警告 回送数据可能出错 6282 警告 文件长度小于Le 6283 警告 选中的文件无效 6284 警告 FCI格式与P2指定的不符 6300
  • Source Insight4 常用设置

    1 Source Insight 简介 Source Insight 是一个面向软件开发的代码编辑器和浏览器 xff0c 它拥有内置的对 C C 43 43 C 和 Java 等源码的分析 xff0c 创建并动态维护符号数据库 xff0c
  • git安装包 阿里镜像-git-for-windows' is not a git command解决方法

    更新git版本时候 xff0c 好多时候使用 git update git update git for windows 命令时 xff0c 会提示 xff1a git 39 update 39 is not a git command g
  • diskgenius 操作sd卡问题 内存变小 合并错误 盘符消失

    SD卡用着用着 xff0c 内存容量就变小 原本16g现在不到8个G 使用 使用本软件可以将硬盘上的空闲区域分配给现有分区 xff0c 调整过程不会影响现有数据 本功能既可以把空闲空间合并到相邻的分区 xff0c 也可以合并到其他不相邻的分
  • vtk 提取等值面并显示

    marchingcube是提取等值面比较通用的算法 xff0c 本文利用vtk 的marching cube接口提取等值面 xff0c 并通过其绘制管线把等值面绘制出来 其原理请参考下文 xff1a 1 等值面的定义及其三角面片近似 等值面
  • curl库函数 说明

    目录索引 xff1a 一 LibCurl基本编程框架 libcurl是一个跨平台的网络协议库 xff0c 支持http https ftp gopher telnet dict file 和ldap 协议 libcurl同样支持HTTPS证
  • 10大经典排序算法-已经亲自验证

    10大经典排序 参考书籍 王道 数据结构第8章节 算法代码在Visio Stdio 2019验证过 xff01 根据操作方式可分5类 xff1a 插入排序 xff0c 交换排序 xff0c 选择排序 xff0c 归并和基数排序 其中 xff
  • 线性表--顺序表、单链表、双链表 总结

    线性表 顺序表 单链表 双链表 基础操作总结 函数 xff1a 王道 数据结构 已在Visio Stdio 2019验证成功 xff01 顺序表插入 删除 查找 单链表的头插法 尾插法 xff0c 按值 按序查找 xff0c 插入 删除 双
  • 串的模式识别和kmp算法

    串的简单模式匹配 与 KMP 获取next数组 参考书籍 王道 数据结构 代码验证软件 xff1a vs2019 include lt iostream gt typedef char SString 暴力比对 S abcabaaabaab