字符串模式匹配——KMP

Warning:本文从常见的字符串模式匹配开始,以通俗易懂的语言阐述了KMP算法原理和适用的场景,编写尽量避免使用晦涩的语言及复杂的数学公式,只为作为学习笔记记录个人的理解过程,追求理论的同学请绕行到《算法导论》。
ps:本文是小编一字一字的码出来的,代码是一行一行敲出来的,欢迎转载,但请务必注明出处。

      在开发过程中,经常会遇到字符串模式匹配的问题,即定位一个子串在主字符串中位置,很多高级语言内置了字符串模式匹配的API。比如在JAVA中,java.lang.String提供了indexOf()、lastIndexOf()方法供开发者调用。但是如果不使用JDK内置的模式匹配函数,我们该如何实现一个高效的模式匹配算法呢?从一个简单的示例开始我们的KMP探索之旅。


一、简单字符串匹配算法

      假设我们要从主串T=”goodgoole”中,找到子串P=”goole”的出现的位置。最基本的思路是:主串T和子串P分别定义游标:i、j,两个游标从0开始移动,逐位进行比较,当某个位置的字符不匹配时,将主串游标i回溯到本次比较开始的下一位,将子串的游标j回溯到0继续比较。步骤如下

  1. i=0;j=0;从主串T的第一位开始,T与S的前三个字符串都匹配成功,但是第四个字符不相等,则主串第一位定位失败。如下图:
    这里写图片描述
    此时,游标i从第四个字符位置回溯到第二个字符,游标j从第四个字符回溯到第一个字符。

  2. i=1;j=0;从主串T第二位开始比较,T[1] = o , P[0] = g,T[1] != P[0] 。如下图:
    这里写图片描述
    子串首位字符与主串第二位字符不相等,向后移动主串的游标i到第三个字符。

  3. i=2;j=0;从主串T第三位开始比较,T[2] =o,P[0]=g, T[2] != P[0] 。如下图:
    这里写图片描述

  4. i=3;j=0;从主串T第四位开始比较,T[3] =d,P[0]=g, T[3] != P[0] 。如下图:
    这里写图片描述

  5. i=4;j=0;从主串T第五位开始比较,T[5] =d,P[0]=g, T[5] == P[5] 。如下图:

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值