KMP模式匹配算法

一、算法思路:

KMP模式匹配算法让主串不发生没必要的回溯,即主串的索引值只做递增操作。如果主串的索引值不发生回溯,那么就需要子串索引值的回溯变化。

子串索引值要以一种怎样的形式就行变化呢?子串索引值的变化方式只和子串自身有关系,而且索引值的变化取决于当前字符之前的串的前后缀的相似度。

我们以next数组表示串的相似度。next数组的本质就是寻找子串中相同前后缀的长度,以此来表达匹配过程中需要跳过的字符个数。即根据已经掌握的信息来避免重复运算。

二、参考链接:

视频参考链接

三、算法代码:

cpp 复制代码
/* KMP字符串匹配算法 */
short kmpSearch(std::string mainStr, std::string subStr) {
	// 获取子串的next数组
	auto retValue = -1;
	const std::vector<short> nextVec = getStrNextVec(subStr);

	// 主串、子串的索引下标
	short mainIdx = 0, subInx = 0;
	while (mainIdx < mainStr.length()) {
		if (mainStr.at(mainIdx) == subStr.at(subInx)) {
			// 字符匹配,索引继续往后偏移
			mainIdx += 1;
			subInx += 1;
		}
		else {
			// 字符不匹配
			if (0 == subInx) {
				// 子串的第一个字符与主串的就不匹配,直接偏移主串索引
				mainIdx += 1;
			}
			else {
				// 根据next数组,跳过子串前面的一些字符
				subInx = nextVec.at(subInx - 1);
			}
		}

		if (subInx == subStr.length()) {
			// 子串的索引值等于子串长度的时候,那么就匹配成功了
			retValue = mainIdx - subInx;
		}
	}

	return retValue;
}



/* 获取字符串的next数组 */
std::vector<short> getStrNextVec(std::string subStr) {
	std::vector<short> nextVec(0);

	int suffixIdx = 1;	// 当前子串后缀对应的索引值
	int prefixLen = 0;	// 当前子串前缀对应的索引值,也表示相同前后缀的最大长度
	while (suffixIdx < subStr.length()) {
		if (subStr.at(prefixLen) == subStr.at(suffixIdx)) {
			// 当前subIdx字符之前的子串具有相同的前后缀,则前后缀长度增加
			prefixLen += 1;
			nextVec.push_back(prefixLen);
			suffixIdx += 1;
		}
		else {
			if (0 == prefixLen) {
				// 上一个子串的相同前后缀长度为0
				nextVec.push_back(0);
				suffixIdx += 1;
			}
			else {
				// 上一个子串的相同前后缀不为0,跳过相似长度进行比较
				// 递推,直至prefixLen == 0;
				prefixLen = nextVec.at(prefixLen - 1);
			}
		}
	}

	return nextVec;
}
相关推荐
find1star10 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing10 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB211210 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP11 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN11 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a1879272183112 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤12 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate13 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran13 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹13 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统