首页 > 编程语言 >算法笔记-字符串算法集合(未完)

算法笔记-字符串算法集合(未完)

时间:2024-10-20 20:35:03浏览次数:1  
标签:匹配 后缀 boarder texttt 笔记 算法 字符串 我们

这里有一些别样的学习思路。

KMP

用途 模式串匹配

过程

我们分解 \(O(nm)\) 的算法过程。

如图,红色竖线包括的为目前匹配成功的部分,对于下一位 \(i\) :

首先,如果成功匹配,那么匹配长度加一。

否则,我们考虑失配情况。

我们会将 \(S\) 串的匹配部分左端点向右移动一位,然后 \(T\) 串从头匹配。

我们发现,如果想要再次考虑第 \(i\) 位,最起码需要匹配到如上图中红色横线的部分,也就是说红色横线的部分完全相等。

如果不完全相等,我们需要比较绿色横线的部分,如此以往。

要么,我们遍历了所有的起点,不存在这种情况,我们就以 \(i\) 位为起点开始重复这个过程。
要么,我们找到了另一个起点,使得我们可以重新考虑第 \(i\) 位的匹配情况。

我们发现,第二种情况中,我们一定找到了红色竖线内的 最长公共前后缀

也就是说,当失配时,我们只需要知道,当前已匹配 \(T\) 串部分的最长公共前后缀。
如果仍然失配,我们继续找到 \(T\) 的最长公共前后缀的最长公共前后缀,重复此过程。

  • 一个字符串 \(S\) 的 最长公共前后缀 为 \(S\) 的长度最长的真子串 \(T\),满足 \(T\) 既是 \(S\) 的前缀,也是 \(S\) 的后缀,以下称作 \(\texttt{boarder}\)。

由此,我们便建立了较为完整的思维过程来优化此算法。

可以发现,我们尽可能地减少了重复的,或者说无意义的比较,算法的 正确性 由此保证。

\(\texttt{boarder}\) 求法

我们用红色横线表示第 \(i - 1\) 位的 \(\texttt{boarder}\)。
可以发现,此过程类似于 \(T\) 的自身匹配,与上述优化过程类似。

时间复杂度

首先来看两主要部分代码:

for (int i = 2, j = 0; i <= M; ++i) {
	while (j and t[j + 1] != t[i]) j = p[j];
	if (t[j + 1] == t[i]) ++j;
	p[i] = j;
}
for (int i = 1, j = 0; i <= N; ++i) {
	while (j and s[i] != t[j + 1]) j = p[j];
	if (s[i] == t[j + 1]) ++j;
	if (j == M) ans.push_back(i - M + 1), j = p[j];
}
//Luogu P3375

以 \(\texttt{boarder}\) 的处理为例,我们发现,变量 \(j\) 最多增量为 \(O(n)\),也就最多向前 \(O(n)\) 次,复杂度为 \(O(n)\)。
匹配过程同理。

总复杂度 \(O(n + m)\)。

标签:匹配,后缀,boarder,texttt,笔记,算法,字符串,我们
From: https://www.cnblogs.com/qkhm/p/18487734/String

相关文章

  • 基于GWO灰狼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) 2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)a=2*(1-(t/Iters));fori=1:Numforj=1:dimr1=rand;r2=......
  • 红外对射传感器计次(江科大stm32学习笔记)
    本篇文章主要完成红外对射传感器计次的案例,为江科大stm32学习后的笔记记录。硬件方面如图所示为本次使用的红外对射传感器,根据相关说明书可知:模块槽中无遮挡时,接收管导通,模块DO输出低电平,遮挡时,DO输出高电平;且有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。如图所示,①......
  • 光敏电阻控制蜂鸣器(江科大stm32学习笔记)
    首先,选择模块化编程,使代码结构更加的清晰,整洁,便于更改。此处需要对蜂鸣器部分,光敏电阻传感器部分进行模块化编程。电路原理图对蜂鸣器以及光敏电阻传感器的电路原理图进行介绍。如图所示为蜂鸣器的电路原理图:采用三级管进行驱动,当PNP的基级引脚接低电平时,蜂鸣器启动,高电平......
  • 计算机网络笔记搜集
    网络体系结构概念与功能网络:网样的东西或者网站系统计算机网络:是一个将分散的、具有独立功能的计算机系统,通过通信设备和线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。计算机网络的功能:数据通信、资源共享、分布式处理(hadoop平台)、提高可靠性、负载均衡...发......
  • 10月阅读笔记1
    在这个月,我有幸阅读一本名为代码大全2的书籍,这是我为它写的第一篇阅读笔记。《代码大全2》是SteveMcConnell的杰作,它被誉为软件开发领域的里程碑式著作。我认为这本书的文字详实、实用,深度剖析了软件设计、编码实践、代码质量和团队协作的各个方面,更是每个程序员不可多得的学习......
  • 代码随想录算法训练营 | 739. 每日温度,496.下一个更大元素 I ,503.下一个更大元素II
    739.每日温度题目链接:739.每日温度文档讲解︰代码随想录(programmercarl.com)视频讲解︰每日温度日期:2024-10-20想法:遍历一遍数组,用栈来存数组下标做记录,因为要找更高得温度,当当前遍历的温度大于栈头存储(存的下标)的温度时,就可以知道栈头要过多少天遇到高温,低的时候直接入栈。J......
  • 线段树分治学习笔记
    前置知识:线段树(只需要了解其结构)支持撤销的数据结构,如可撤销并查集,可持久化数据结构等。线段树分治是什么一种离线算法,用于处理假如某些信息会在某个时间段出现,求某个时刻的信息并。常见的离线算法还有CDQ分治,考虑一下这两个算法的区别。CDQ分治:对于每个操作,考虑其对后面询......
  • 七、朴素贝叶斯算法
    朴素贝叶斯算法前言一、概念二、贝叶斯定理三、朴素贝叶斯分类器四、训练过程第一步:计算计算先验概率第二步:计算条件概率五、模型预测六、常见变体6.1高斯朴素贝叶斯(GaussianNaiveBayes):6.2多项式朴素贝叶斯(MultinomialNaiveBayes):6.3伯努利朴素贝叶斯(BernoulliNa......
  • spring笔记
    @Slf4j@RestController@Validated1、Circularviewpath[register]:woulddispatchbacktothecurrenthandlerURL[/register]again.(循环视图路径)把@Controller改成@RestController (相当于@Controller和@ResponseBody的组合)2、@Slf4j注解使用,方便调试log.info......
  • C语言深入理解指针笔记(3)
    1.字符指针变量 我们已经了解的指针变量类型有:整形指针变量:int*pint:存放的是整型变量的地址浮点型指针变量:float*pf:存放的是浮点型变量的地址类比可知:char*pc:字符型指针变量:存放的是字符型变量的地址,指向字符型的数据 首先,字符型指针变量的使用有两种方法:......