数据结构与算法 - 串

news/2024/12/25 14:29:46/文章来源:https://www.cnblogs.com/lightcone/p/18500059

KMP字符串匹配算法

image
next数组的计算方法:
看该字符前的字符串的前缀和后缀有多少相同(可以交叉重叠),就让相同的数量值加一即为当前next值。
也可以这样计算:看前一个字符的next值处是否与前一个字符相同,若相同,则当前next值为上一next值加一;若不相同,则查看上一next值处的字符的next处于当前的字符是否相同,直到相同之后,让相同的值加一(如果到达最开头都不相同,则直接设置为1,总之就是到相同的位置的next值加一)。
下面是一个例子:
image

A B C A B C D
0 1 1 1 2 3 4

因此,在第一次失配时,如上图红框区域,j指针直接回到了next[j]的位置,当j位于第一个时(即第一个就失配),i++并且j不变,以此类推
nextval数组的计算方法
规则:
对比当前next值处的字符是否与当前字符相同,若相同,则nextval也与那字符的nextval相同;若不同,则nextval与其next值相同;
例子:

索引 1 2 3 4 5 6 7 8 9 10 11 12
字符串 a b a b a a a b a b a a
next数组 0 1 1 2 3 4 2 2 3 4 5 6
nextval数组 0 1 0 1 0 4 2 1 0 1 0 4
解释: 前一个是b,b和a不相同,到第一个,设置为1 前一个是a,与b不一样,和b还是不一样,和a一样,1+1=2
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
using namespace std;#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];void strLength(SString S) {int m;for (m = 1; S[m] != '\0'; m++);S[0] = m - 1;
}void get_next(SString T, int* next) {int j = 1, k = 0;next[1] = 0; // 初始化 next[1] 为 0while (j < T[0]) {  // T[0] 是串 T 的长度if (k == 0 || T[j] == T[k]) {j++;k++;next[j] = k;}else {k = next[k];}}
}int Index_KMP(SString S, SString T, int pos, int* next) {int i = pos, j = 1; // i 指向主串 S 的当前字符,j 指向模式串 T 的当前字符get_next(T, next);  // 计算模式串 T 的 next 数组while (i <= S[0] && j <= T[0]) {if (j == 0 || S[i] == T[j]) {  // 如果匹配,或 j = 0(即从头匹配)i++;j++;}else {j = next[j];  // 如果失配,j 跳转到 next[j]}}if (j > T[0]) return i - T[0]; // 匹配成功else return 0;  // 匹配不成功
}int main() {SString S, T;int pos;int next[MAXSTRLEN];int r;printf("输入主串 S: ");scanf("%s", S + 1);  // 跳过下标为 0 的元素printf("输入模式串 T: ");scanf("%s", T + 1);  // 跳过下标为 0 的元素printf("输入起始位置 pos: ");scanf("%d", &pos);strLength(S);   // 求主串 S 的长度strLength(T);   // 求模式 T 的长度if (r = Index_KMP(S, T, pos, next))printf("模式串在主串中的位置为:  %d \n", r);else printf("匹配失败!");return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【产品经理简历模板】绿色清新产品经理求职简历模板下载

【产品经理简历模板】绿色清新产品经理求职简历模板下载,Word【可编辑】,个人简历,免费简历​产品经理求职简历模板下载 绿色清新产品经理求职简历免费下载,可编辑WORD格式简历模板免费下载直接修改,高效-便捷-实用,满足求职者的简历制作需求,简历编辑制作不求人,有效…

【产品经理经理模板】清爽产品经理求职简历模板下载

【产品经理经理模板】清爽产品经理求职免费简历模板下载,Word【可编辑】,个人简历,免费简历模板​产品经理求职简历模板下载 清爽产品经理求职简历免费下载,可编辑WORD格式简历模板免费下载直接修改,高效-便捷-实用,满足求职者的简历制作需求,简历编辑制作不求人,有效…

vovsoft Text Edit Plus v14 离线激活

vovsoft Text Edit Plus v14 目录vovsoft Text Edit Plus v14程序信息text-edit定位按钮事件NagScreen: TNagScreenTNagScreen.BitBtn3ClickTNagScreen.TimerContinueTimerTNagScreen.TimerActivatorTimer离线校验逻辑TChecker 类TChecker.Executecheck_9A6AEC网络请求失败时,校…

指针、引用

内存 1.什么是内存?内存也叫主存储器,用于临时存储数据和程序指令,便于CPU(也就是处理器)快速访问读写非常快,对比硬盘等外存,一秒一般 \(10^8\) 次读写,下面是一个输出一秒大致多少次运算的程序 int main() {//clock_t 是一个用来表示CPU时钟的变量 clock()函数是获取…

javaweb基础总结

截至目前还差最后一个案例 最后再重写一遍所有功能即可 但也包括一些新的功能 学习笔记如下图 一大半代码还是自己敲得 摸样的话大部分都是这样的

【牛客训练记录】牛客周赛 Round 66

训练情况赛后反思 目测 D、E是什么神秘线段树数据结构题吧,没有做出来,还得加练。 A题 先三个数排序,要么那最大的,要么拿两个较小的和,答案取大值即可。 #include <bits/stdc++.h> #define int long longusing namespace std;void solve(){int a[3];cin>>a[0…

【通用简历模板】简洁清爽通用求职简历模板下载

【通用简历模板】简洁清爽通用求职免费简历模板下载,Word【可编辑】,个人简历,免费简历​通用简历模板下载 ​ 简洁清爽通用求职简历免费下载,可编辑WORD格式简历模板免费下载直接修改,高效-便捷-实用,满足求职者的简历制作需求,简历编辑制作不求人,有效提升求职效率!…

一款开源简洁高颜值的酷狗第三方客户端V1.0.0 Beta

MoeKoe Music前言 早在10年前后的样子,那会在用网页版QQ的时候我就已经开始使用酷狗音乐了(也是十来年的老粉了),所以这些年收藏的歌曲全部都在上面.后来我也尝试开始使用网易云或QQ音乐,也尝试把酷狗的歌单导入进去,但是效果都不尽人意.我听的大多是日漫OP,好多歌曲都没办法找…

计量经济学(十六)——工具变量法

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 在经济学和其他社会科学的研究中,研究人员经常希望通过观察数据来推断因果关系,以理解变量之间的影响机制。然而,实际数据往往受到多种因素的干扰,使得自…

『模拟赛』NOIP2024模拟1(更新 T2 T4)

『模拟赛记录』NOIP2024模拟1Rank 有点可惜,A. 玩游戏 绝妙贪心题。感觉这种能产生很多假做法且都可 hack 的贪心都是好题。 赛时不知道为什么犯唐没交一开始的暴力贪心。 考虑双指针,设左右指针分别为 \(l,r\)。主要思路是实时维护当前两个指针向两边最近的一个区间和不为正…

西电校园网基于 PPPoE+DHCP 方式实现带宽叠加

前言 由于个人对宿舍内局域网有一定需求,于是考虑在宿舍内配置一台路由器来搭建局域网。 而又因为西电的校园网有如下一些性质:一个免费账号可以同时在线 3 台设备,每台设备限速 100M。 校园无线网通过深澜 Portal 认证方式在设备连接到校园网 AP 且在网页端登录后以 DHCP 方…

博客园美化-Awescnb主题

本文主要记录安装Awescnb皮肤的安装过程,以及我做的配置,作为备份。一、安装皮肤 安装超级简单,根据官方文档,一分钟就搞定。首页HTML: <div id="loading"><div class="loader-inner"></div></div>页面定制CSS: #loading{bo…