首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >KMP 模式匹配算法

KMP 模式匹配算法

原创
作者头像
用户7737280
修改2021-11-10 16:35:19
修改2021-11-10 16:35:19
1.4K0
举报

由三位前辈发表的一个模式匹配算法,可以大大避免重复遍历的情况,称之为克努特-莫里斯-普拉特算法,检查 KMP 算法。

又叫 快速模式匹配算法。

KMP 算法相比于 BF 算法,优势在于:在保证指针 i 不回溯的前提下,当匹配失败时,让模式串向右移动最大的距离;

并且可以在 O(n+m) 的时间数量级上完成对串的模式匹配操作。KMP 算法原理参考链接:CSDN nextval[1] = 0;   int j = 0;

  while (i<strlen(str)) @version v1.0 * @copyright Copyright By lizhuming, All Rights Reserved * @blog http://lx.gongxuanwang.com/sszt/7.htm{     if (j == 0 || str[j-1] == str[i-1])

原理:主串 S 与模式串 T 有部分相同子串时,可以简化朴素匹配算法中的循环流程 湖北遴选从子串最长前缀和最长后缀开始求。最长也少于前面字符个数。最长公共前缀的后面一个字符(指针 j)和匹配失败的那个字符(指针 i)进行对比。于模式串中的某一字符来说,提取它前面的字符串,分别从字符串的两端查看连续相同的字符串的个数,在其基础上 +1 ,结果就是该字符对应的值。

  • 注意:即是不要从可能最长的公共前后缀开始一个减一个地对比下去。如求图中 j+1 的 next 值时,暴力算法就是对比 aabcaabcaaabcaabcaab,如果失败就减少一个长度继续重新对比 aabcaabcabcaabcaab。然后循环下去。

湖北遴选字符对应 next 是第 0 个字符对应 next 数组下标为 1 开始的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档