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 数组就行
相关推荐
姓蔡小朋友10 小时前
算法-滑动窗口
算法
君义_noip11 小时前
信息学奥赛一本通 2134:【25CSPS提高组】道路修复 | 洛谷 P14362 [CSP-S 2025] 道路修复
c++·算法·图论·信息学奥赛·csp-s
kaikaile199511 小时前
基于拥挤距离的多目标粒子群优化算法(MO-PSO-CD)详解
数据结构·算法
不忘不弃11 小时前
求两组数的平均值
数据结构·算法
leaves falling11 小时前
迭代实现 斐波那契数列
数据结构·算法
珂朵莉MM11 小时前
全球校园人工智能算法精英大赛-产业命题赛-算法巅峰赛 2025年度画像
java·人工智能·算法·机器人
Morwit11 小时前
*【力扣hot100】 647. 回文子串
c++·算法·leetcode
DonnyCoy11 小时前
Android性能之数据结构
数据结构
AI视觉网奇12 小时前
audio2face mh_arkit_mapping_pose_A2F 不兼容
笔记·ue5
天赐学c语言12 小时前
1.7 - 删除排序链表中的重要元素II && 哈希冲突常用解决冲突方法
数据结构·c++·链表·哈希算法·leecode