04-4.2.2 KMP 算法

  • 👋 Hi, I'm @Beast Cheng
  • 👀 I'm interested in photography, hiking, landscape...
  • 🌱 I'm currently learning python, javascript, kotlin...
  • 📫 How to reach me --> 458290771@qq.com

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻

此外,《程序员必备技能》专栏日后会逐步更新,感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀

谢谢大家!🙏

对于模式串 T = "abaabc"

  • 第六个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=3
  • 第五个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=2
  • 第四个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=2
  • 第三个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=1
  • 第二个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=1
  • 第一个 元素匹配失败时,可令主串指针i不变 ,模式串指针 j=0, i++, j++
    通过一个 next 数组来存储模式串 T 的序号,next 数组只和模式串有关,和主串无关
    用代码表示刚才的逻辑:
c 复制代码
if(s[i] != T[j])
	j = next[j];
if(j == 0){
	i++; j++;
}

KMP 算法的逻辑

根据模式串 T ,求出 next 数组 --> 利用 next 数组进行匹配(主串指针不回溯


先来看第二步:利用 next 数组进行匹配(主串指针不回溯

代码实现:

c 复制代码
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;
}

朴素模式匹配算法,最坏时间复杂度: O ( n m ) O(nm) O(nm)

KMP算法,最坏时间复杂度: O ( n + m ) O(n+m) O(n+m)

  • 其中,求 next 数组时间复杂度 O ( m ) O(m) O(m)
  • 在考研中,只需要大家能够手动求出 next 数组就行
相关推荐
别或许2 分钟前
2、高数----数列极限(知识总结)
算法
江奖蒋犟6 分钟前
【C++】map和set
开发语言·数据结构·c++·set·map
汀、人工智能9 分钟前
[特殊字符] 第78课:乘积最大子数组
数据结构·算法·数据库架构·数组·前缀积·乘积最大子数组
tankeven9 分钟前
HJ168 小红的字符串
c++·算法
数据知道12 分钟前
claw-code 源码分析:cargo 视角的 definitive runtime——会话、压缩、MCP、提示构造如何落到系统语言?
算法·ai·claude code·claw code
GLDbalala14 分钟前
GPU PRO 5 - 1.3 Particle-Based Simulation of Material Aging 笔记
笔记
一定要AK15 分钟前
CSS 入门到精通全章节学习笔记(含 CSS3 核心特性)
css·笔记·学习
汀、人工智能15 分钟前
[特殊字符] 第41课:翻转二叉树
数据结构·算法·数据库架构·图论·bfs·翻转二叉树
2301_8227032016 分钟前
大学生体质健康测试全景测绘台:基于鸿蒙Flutter的多维数据可视化与状态管理响应架构
算法·flutter·信息可视化·架构·开源·harmonyos·鸿蒙
鲸渔16 分钟前
【C++ 输入输出】cin、cout、cerr 与格式化输出
开发语言·c++·算法