KMP算法
一. 最简单的字符串匹配
记录两初始指针从前往后移动,匹配成功则一起后移
匹配失败则模板串指针回到首位,被匹配串指针移到上一次上一次初始匹配的下一位置
直至模板串匹配完返回真,或者被匹配串匹配完返回假,时间复杂度为O(mn)
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.size()==0) return 0;//空串
int i =0, j =0;//因为还会用到,所以不能在循环中定义
while(i<haystack.size()&&j<needle.size()){
if(haystack[i]==needle[j]){i++;j++;}//单字符匹配成功一起后移
else{i=i-j+1;j=0;}//模板串指针重置,匹配串指针移动到上次开始匹配的下一位置
//注意这里得先重置i指针,即被匹配串指针,否则会失去移动距离的信息
}
//匹配结束
if(j==needle.size()) return i-j;
return -1;//匹配失败
}
};
二. KMP算法
C++做题模板
vector<int> fail(len, -1);//初始无前一元素,跳转-1,同时表示无相等元素,因为后面还要增
for (int i = 1; i < len; i++){//从1开始,评估每个位置应跳转的地方
int j = fail[i - 1];//前一元素的跳转位置
while (j != -1 && evil[j + 1] != evil[i]) //跳转后的后一元素继续比较当前元素
j = fail[j];//,匹配失效,继续跳转,压缩转移位置
if (evil[i] == evil[j + 1]) fail[i] = j + 1;//相等记录该位置
//否则跳转到-1
}
暴力匹配的优化,实际上改进了匹配失效后,主串指针回溯的距离,减少遍历次数
核心是对模板串进行评估,记录匹配任意一位匹配失效需要回溯的距离(位置),空间换时间
时间复杂度为O(m+n),使算法性能成线性
具体方法是利用模板串本身结构特点,使得已遍历的信息不用再次确认,即用这种结构记录了已遍历信息
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本