王道408数据结构——第四章 串(KMP算法)

一、串的定义和实现

字符串简称串,是由零个或多个字符组成的有限序列,一般记为S=′a1a2⋅⋅⋅an′S='a_1a_2···a_n'S=a1a2an,n称为串的长度。
串中任意多个连续字符组成的子序列称为该串的子串,相应的该串称为主串。某个字符在串中的序号称为字符在串中的位置,子串在串中的位置已子串的第一个字符的位置表示。
两个串相等的充分必要条件是:两个串长度相等,且各个位置对应字符相等

在王道教材中,串的下标从1开始

串的储存表示

1. 定长顺序储存表示

类似于线性表的顺序存储结构,用一组地址连续的存储单元储存串值的字符序列。为每个串,变量分配一个固定长度的储存区,即定长数组。
串的实际长度不能超过MAXSIZE,超过定长的串值会被舍去,称为截断(要客服这种弊端,只能采用动态分配的方法,不限定最大长度)。串的实际长度有两种表达方式:一种是用一个额外的变量存放串的长度;二是在串值后加一个不计入串长的结束标记符号“\0”,此时串长为隐含值。

2. 堆分配储存表示

堆分配储存表示仍然以一组地址连续的存储单元存放串值的字符序列,但他们的存储空间实在程序执行时动态分配的(从一个称为“堆”的自由储存区获取)。

二、模式匹配

求子串(模式串)在主串中的位置。
简单模式匹配算法最坏时间复杂度为O(mn),m和n非别为模式串和主串的长度。
简单模式匹配算法可以改进为KMP算法。

next数组

next[j]的取值为该字符前一个元素的部分匹配值+1,即最长相同前后缀长度+1,同时规定next[1]=0。
例如对于以下模式串,有next数组:

j123456789
模式abaabcaba
next[j]011223123

KMP算法执行

整体上与简单匹配算法类似
当匹配过程产生失配时,指向主串的指针i不变,指向模式串的指针j退回到next[j]的位置并重新进行比较;
当j为0时,i与j同时加1;
若主串的第i个位置和模式串的第一个字符不等,从主串的第i+1个位置开始匹配。
代码如下

int indexKMP(String S, String T, int next[]){  // 主串,模式串,next数组int i = 1, j = 1;while(i <= S.length && j <= T.length){if(j==0 || S.ch[i] == T.ch[j]){  // j等于0或未适配,两指针均向后移动i++;j++;}else{  // 指针失配且j不等于0,i不移动,j移动到next[j]处j = next[j];}if(j > T.length)return i - T.length;  // 匹配成功else return 0;
}

KMP算法的时间复杂度为O(m+n)O(m+n)O(m+n),而一般情形下普通模式匹配算法实际执行时间近似也为O(m+n)O(m+n)O(m+n),因此至今仍被采用。KMP仅在主串与模式串有很多部分匹配时才显得比普通算法快得多,其主要优点是主串不回溯。

KMP算法优化

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

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

相关文章

ThoughtWorks技术雷达专区

作为一家服务于全球不同类型的IT专业服务公司&#xff0c;ThoughtWorks从未停止过对卓越技术的追求&#xff0c;为此&#xff0c;ThoughtWorks的全球技术委员会(TAB)会定期讨论技术战略&#xff0c;并将其绘制成一份能够体现技术趋势的雷达图&#xff0c;它相当于当下技术领域的…

腾讯视频VIP周卡深圳地区免费领!附非深圳免费领腾讯视频会员攻略

深圳今天开始&#xff0c;暂停了所有公共交通&#xff0c;小区开始封闭管理&#xff0c;大家都居家办公&#xff0c;腾讯官方今天给深圳地区用户免费发放7天腾讯视频VIP会员&#xff0c;居家期间&#xff0c;可以追剧了&#xff01;这是腾讯官方给深圳地区的抗疫福利&#xff0…

编译器与解释器

什么是编译器&#xff1f;什么事解释器&#xff1f; 编译器是女儿&#xff0c;解释器是儿子。为什么这么说呢&#xff1f; 引用文章 http://www.cnblogs.com/sword03/archive/2010/06/27/1766147.html 大概总结就是&#xff1a;妈给儿子和女儿打电话说&#xff1a;你们的老爸不…

SQL Server 权限的分类

SQL Server 的权限可以分三类 第一类 server 层面上的&#xff1a; select * from sys.fn_builtin_permissions(default) where class_desc like server; 第二类 database 层面&#xff1a; select * from sys.fn_builtin_permissions(default)    where class_desc like d…

C和指针之部分理解和编码总结

1、在C语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向成一个指向其首元素首地址的指针 这也就是为什么数组int a[10],a不能a++操作,而把a传递给函数的时候,可以作为指针a++操作的原因。 2、内存为0的地址处,也就是NULL地址处,一般定义指针变量的同时…

王道408数据结构——第五章 树与二叉树

文章目录一、树的基本概念树的性质二、二叉树满二叉树完全二叉树二叉排序树平衡二叉树二叉树的性质完全二叉树的性质三、二叉树的储存结构顺序储存链式存储四、树的储存方式双亲表示法孩子表示法孩子兄弟表示法&#xff08;二叉树表示法&#xff09;五、二叉树的遍历先序遍历&a…

Redis集群监控RedisClusterManager

Redis集群监控RedisClusterManagerRedisClusterManager监控Redis集群1234环境要求&#xff1a;Java8jdk配置这里略过RedisClusterManager 下载地址&#xff1a;https://git.oschina.net/yanfanVIP/RedisClusterManager/releases1234567891011121314151617181920212223242526272…

Visual Studio怎么使用中文帮助文档

今天给大家带来vs中怎么使用帮助文档&#xff1f;事情起因是这样的&#xff0c;上周有个哥们问我问题&#xff0c;字符串怎么分割啊&#xff0c;我当时有点忙&#xff0c;我就说你去看看帮助文档。然后过了三十秒 我看见他打开了百度。。。。。。我郁闷了 &#xff0c;我说你直…

C和指针之函数之在数组中找特定元素并返回指向该位置的指针

1、问题 在数组中找特定元素并返回指向该位置的指针2、代码实现 #include <stdio.h> #include <stdlib.h>//数组中找特定元素并返回指向该位置的指针 int *find_int(int key, int array[], int array_len) {int i;for (i 0; i < array_len; i){if (array[i] k…

逻辑推理题

25匹马找前3名或者前5名&#xff0c;最少用几次&#xff1f; 火车站集合&#xff0c;最后一个人几点到&#xff1f;转载于:https://www.cnblogs.com/kira2will/p/4058223.html

sublime快捷键收藏

快速查找&#xff08;ctrl P&#xff09;输入函数名可以快速找到函数。输入#文本可以快速进行文件内文本匹配。3. 多行游标功能&#xff08;ctrl D&#xff0c;非常实用&#xff09;如何将文件中的某个单词更改为另一个&#xff1f;方法一&#xff1a;利用查找替换功能&#…

C和指针之函数之归以字符形式按顺序打印数字的每位数字(递归和非递归)

1、问题 以字符形式按顺序打印数字的每位数字(递归和非递) 2、代码实现 #include <stdio.h> #include <math.h> //以字符形式按顺序打印数字的每位数字,比如4267,打印4267 //递归实现void printf_char(unsigned int value) {unsigned int tmp;tmp = value / 10;…

王道408数据结构——第六章 图

文章目录一、图的基本概念二、图的储存邻接矩阵邻接表十字链表邻接多重表三、图的基本操作四、图的遍历广度优先搜索&#xff08;BFS&#xff09;深度优先搜索&#xff08;DFS&#xff09;图的遍历和图的连通性五、最小生成树Prim算法Kruskal算法六、最短路径Dijkstra求单源最短…

使用 python 的 urllib2和 urllib模块爆破 form 表单的简易脚本

python 的 http 中 urllib2和 urllib模块在web 表单爆破的使用方法脚本中还增加了 urllib2和 urllib模块如何添加代理的方法# -*- coding: utf-8 -*- import urllib2 import urllib import timedef brute_force(user, password):#strip() 方法用于移除字符串头尾指定的字符&…

如何在 ASP.NET Core 中为同一接口配置不同的实现

前言通常&#xff0c;我们使用依赖注入时&#xff0c;一个接口仅对应一种实现&#xff0c;使用时可以直接得到实现类的实例&#xff0c;类似这样&#xff1a;services.AddScoped<IServiceA,ServiceA>();public WeatherForecastController(IServiceA service) { }但是&…

jQuery学习笔记2

一、获取并设置CSS类&#xff1a; 1、addClass( ) 方法 &#xff1a;可以选取多个元素&#xff0c;也可以在该方法中规定多个类。 1 $("#div1").addClass("important blue"); 2 $("h1,h2,p").addClass("blue"); 2、removeClass( )方法…

分析windows宿主机Ping不通linux虚拟机的其中一种情况

ping不通的情况是由于设置网络选项的时候&#xff0c;可以看到界面名称的选择如下(当前选择的是无线网卡驱动): ping得通的情况是由于设置网络选项的时候&#xff0c;可以看到界面名称的选择如下(当前选择的是有线网卡驱动): 分析原因是由于电脑有两个网卡驱动&#xff0c;一个…

C和指针之函数之实现阶乘和斐波那契数(递归和非递归)

1、问题 实现阶乘和斐波那契数(递归和非递归) 2、代码实现 #include <stdio.h>int num = 0; //递归实现斐波那契数 // n <=2, f(n) = 1, n > 2 f(n) = f(n - 1) + f(); long fibonacci(int n) {//计算fibonacci(3)计算了多少次if (n == 3)num++;if (n <= 2){p…

同事都说有SQL注入风险,我非说没有

前言现在的项目&#xff0c;在操作数据库的时候&#xff0c;我都喜欢用ORM框架&#xff0c;其中EF是一直以来用的比较多的&#xff1b;EF 的封装的确让小伙伴一心注重业务逻辑就行了&#xff0c;不用过多的关注操作数据库的具体细节。但是在某些场景会选择执行SQL语句&#xff…

​【v2.x OGE-example 第二节】 实体参数

【v2.x OGE-example 第二节】 实体参数1. 位置&#xff1a;Drawing_example --> SpriteParameters2. 类名&#xff1a;SpriteParameters(1)旋转精灵&#xff1a;sprite.setRotation(float pRotation) 设置旋转角度sprite.setRotationCenter(float pRotationCenterX, float p…