第四章 串 KMP算法

news2024/11/24 9:17:47

一、代码实现

int Index_KMP(SString s,sstring T,int next[] ){
    int i=1, j=1;
    while(i<=s.length&&j<=T.length){
        if(j==0] ||s.ch[i]==T.ch[j]){
            ++i;
            ++j;//继续比较后继字符
        }
        else
        j=next[j];//模式串向右移动
    }
    if(j>T.length)
        return i-T.length;//匹配成功
    else
    return 0;
}

二、next数组手算方法

注意:next数组的第一个数只能是0,第二个数只能是1。

例1:模式串为  a,b,a,b,a,a

1.当第3个数不匹配时

我们可知主串的前两个为a,b,其他未知

将模拟串后移,直到遇到可以匹配的字符串,或问号后停止,j指向1

2.当第4个数不匹配时

 

3.当第5个数不匹配时

 

 4.当第6个数不匹配时

 

 三、nextval数组求法

1.代码实现

nextval[1]=0;
for (int j=2;j<=T.length;j++){
    if(T.ch[next[j]]==T.ch[j])
        nextval[j]=nextval[next[j]];
    else
        nextval[j]=next[j];
}

2.例子

(1)我们先得到一个模拟串的next数组,设定一个nextval数组,nextval[1]一定为0。

(2)从第2个开始判断,此时,j==2,next[j]==1,  string[j]==b,

我们使用next[j]作为新的j1,也就是j1==1,string[j1]==a。

因为两次得到的字符一个为a一个为b,不相等,所以nextval[j]等于next[j].

(3)判断第3个,此时,j==3,next[j]==1,  string[j]==a,

我们使用next[j]作为新的j1,也就是j1==1,string[j1]==a。

因为两次得到的字符都是a,相等,所以nextval[j]等于nextval[ next[j] ]。

(4)判断第4个,此时,j==4,next[j]==2,  string[j]==b,

我们使用next[j]作为新的j1,也就是j1==2,string[j1]==b。

因为两次得到的字符都是b,相等,所以nextval[j]等于nextval[ next[j] ]。

(5)判断第5个,此时,j==5,next[j]==3,  string[j]==a,

我们使用next[j]作为新的j1,也就是j1==3,string[j1]==a。

因为两次得到的字符都是a,相等,所以nextval[j]等于nextval[ next[j] ]。

(6)判断第6个,此时,j==6,next[j]==4,  string[j]==a,

我们使用next[j]作为新的j1,也就是j1==4,string[j1]==b。

因为两次得到的字符一个是a一个是b,不相等,所以nextval[j]等于next[j]。

(7)得到最终的优化数组为

 优点:可以减少时间复杂度

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1273. 删除树节点;2786. 访问数组中的位置使分数最大;889. 根据前序和后序遍历构造二叉树

1273. 删除树节点 核心思想&#xff1a;递归&#xff0c;从根节点出发&#xff0c;枚举父节点的子节点&#xff0c;如果它们的值加起来为0的话就把父亲的节点删除后剩余的数置为0&#xff0c;默认返回一个节点&#xff0c;del_remain保存的是&#xff0c;del_remain[x]表示完成…

常见的数据库备份方法,常用的数据库备份方法有哪三种

数据库作为存储和管理这些信息的核心&#xff0c;其安全性和稳定性尤为重要。因此&#xff0c;定期进行数据库备份是保护数据完整性的重要途径。下面我们就详细介绍几种常见的数据库备份方法。 1.全量备份 全备份是指备份数据库中的所有数据和元数据。这种方法通常用于开发或测…

【javaweb】学习日记Day6 - Mysql 数据库 DDL DML DQL

之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客 目录 一、概述 1、如何安装及配置路径Mysql&#xff1f; 2、SQL分类 二、DDL 数据定义 1、数据库操作 2、IDEA内置数据库使用 &#xff08;1&…

【Java alibabahutool】JSON、Map、实体对象间的相互转换

首先要知道三者的互转关系&#xff0c;可以先将JSON理解成是String类型。这篇博文主要是记录阿里巴巴的JSONObject的两个方法。toJSONString()以及parseObject()方法。顺便巩固Map与实体对象的转换技巧。 引入依赖 <!-- 阿里巴巴 JSON转换 以下二选一即可 没有去细研究两者…

中国电动汽车市场再添新玩家,小米启动造车梦 | 百能云芯

综合多家媒体广泛报道&#xff0c;知情人士透露&#xff0c;小米公司已获得正式批准&#xff0c;允许其踏入电动汽车制造领域。这一举措标志着这家在智能手机和物联网领域声名卓著的企业正迈向汽车制造领域&#xff0c;可谓迈出了重要的一步。按照计划&#xff0c;小米将于2024…

CTFhub-sqli注入-报错注入

用到的函数 updatexml(1&#xff0c; &#xff0c;1) concat(0x7e, ,0x7e) group_concat(目标值) right(&#xff0c;32) 1 1 1 union select updatexml(1,concat(0x7e,database(),0x7e),1) 1 union select updatexml(1,concat(0x7e,(select(group_concat(ta…

LeetCode438.找到字符串中所有字母异位词

因为之前写过一道找字母异位词分组的题&#xff0c;所以这道题做起来还是比较得心应手。我像做之前那道字母异位词分组一样&#xff0c;先把模板p排序&#xff0c;然后拿滑动窗口去s中从头到尾滑动&#xff0c;窗口中的这段字串也给他排序&#xff0c;然后拿这两个排完序的stri…

使用ELK(ES+Logstash+Filebeat+Kibana)收集nginx的日志

文章目录 Nginx日志格式修改配置logstash收集nginx日志引入Redis收集日志写入redis从redis中读取日志 引入FilebeatFilebeat简介Filebeat安装和配置 配置nginx转发ES和kibanaELK设置账号和密码 书接上回&#xff1a;《ELK中Logstash的基本配置和用法》 Nginx日志格式修改 默认…

Nexus私有仓库+IDEA配置远程推送

目录 一、docker安装nexus本地私服&#xff0c;Idea通过maven配置deploy本地jar包&#xff08;简单&#xff09; 二、docker push镜像到第三方nexus远程私服&#xff08;shell命令操作&#xff09; 三、springboot通过maven插件自动生成docker镜像并push到nexus私服&#xf…

哈夫曼编码:高效的数据压缩方案

在计算机科学中&#xff0c;数据的压缩与编码一直是重要的研究领域。哈夫曼编码&#xff08;Huffman Coding&#xff09;作为一种常用的数据压缩方法&#xff0c;以其高效的压缩率和广泛的应用而闻名。本文将介绍哈夫曼编码的原理、构建过程以及代码实现&#xff0c;并通过符号…

日常Debug之:智子攻陷了我的MCU!!!

环境&#xff1a;AT32F403AVGT7、IAR8.30、J-LINK 现象&#xff1a;定时器中断里遇到 -1 < 0 返回false的情况。如图&#xff1a; 出现了if(-1 > 0){}为True的情况。 尼马&#xff01;&#xff01;&#xff01;是不是被智子监控了呢&#xff1f; 经过分析&#xff1a;…

点亮社交新篇章:探索 WeTalk 新增的头像与群聊功能

目录 引言&#xff1a; 引入头像功能&#xff1a; 头像功能的优势&#xff1a; 引入群聊功能&#xff1a; 群聊功能的优势&#xff1a; 引入头像功能&#xff1a; 查看头像&#xff1a; ​编辑 上传头像&#xff1a; 引入群聊功能&#xff1a; 创建群聊&#xff1a…

scp命令用于Windows和Linux之间复制文件

scp使用 简述Windows和Linux之间复制文件使用示例从本地复制到远程复制文件复制文件夹 从远程复制到本地复制文件复制文件夹 在Linux下&#xff08;从Linux复制到Windows&#xff09;复制文件复制文件夹 在Windows下&#xff08;从Windows复制到Linux&#xff09;复制文件复制文…

Mybatis中的分页查询,以及对于特殊符号的处理

目录 一.分页查询 1.老版本的分页查询 &#xff08;通过工具类BaseDao来实现&#xff09; 2.利用Mybatis实现分页效果 2.1最低级版本&#xff08;利用limit实现&#xff09; 首先在xml定义分页需要的方法 然后在bookbiz实现方法 其次在bookbizImpl继承此方法&#xff0c;并…

2023 CCPC 华为云计算挑战赛 D-塔

首先先来看第一轮的 假如有n个,每轮那k个 他们的高度的可能性分别为 n 1/C(n,k) n1 C(n-(k-11),1)/C(n,k) n2 C(n-(k-21),2)/C(n,k) ni C(n-(k-i1,i)/C(n,k) 通过概率和高度算出第一轮增加的期望 然后乘上m轮增加的高度加上初始高度&#xff0c;就是总共增加的高度 下面是…

YOLOv7-tracker 目标追踪 输入视频帧

参考项目&#xff1a;https://github.com/JackWoo0831/Yolov7-tracker/tree/master github链接&#xff1a;https://github.com/Whiffe/Yolov7-tracker 码云链接&#xff1a;https://gitee.com/YFwinston/Yolov7-tracker 1 项目安装 1.1 环境搭建 平台&#xff1a;AutoDL 选…

学习网络编程No.4【socket编程实战】

引言 北京时间&#xff1a;2023/8/19/23:01&#xff0c;耍了好几天&#xff0c;主要归咎于《我欲封天》这本小说&#xff0c;听了几个晚上之后逐渐入门&#xff0c;在闲暇时间又看了一下&#xff0c;小高潮直接来临&#xff0c;最终在三个昼夜下追完了&#xff0c;哈哈哈&…

Android 11 Display亮灭屏

系统休眠唤醒的时候会涉及到亮灭屏&#xff0c;下面分析下系统&#xff08;高通8155平台&#xff09;Display亮灭屏流程 1. 点亮屏幕 点亮屏幕入口在framework/base/下面LightsService.java&#xff0c;然后通过调用SurfaceControl.java ,最终调用到framework/native下面的Sur…

4.5 TCP优化

TCP 三次握手的性能提升 三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上&#xff0c;所以要正确使用三次握手的中参数&#xff0c;需要先用netstat命令查看是哪个握手阶段出了问题&#xff0c;主动发起连接的客户端优化相对简单些&#xff0c;而服务端需要监听端口&a…