KMP算法问题简单思考记录

     常规解决主串中查找匹配的子串的问题是通过 朴素匹配算法,简单讲,就是通过比较主串和子串的第一个字符来查找,若主串和子串的第一个字符不相同,那么主串第二个字符和子串相比较,如若相同,主串和子串再比较下一个字符,以此类推,知道比较主串中找到连续的字符 与子串相同,则结束匹配。

    KMP算法呢 主要通过一个next数组记录主串中每一个子序列中最长的共有元素长度值 如(借图)


- "A"的前缀和后缀都为空集,共有元素的长度为0;

  - "AB"的前缀为[A],后缀为[B],共有元素的长度为0;

  - "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0;

  - "ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0;

  - "ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为"A",长度为1;

  - "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2;

  - "ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0。

  如上,next记录部分匹配值,然后主串和子串比较时,如若主串一部分与子串相同,那么就跳过已经相同的部分,从主串与子串不同的部分开始比较,跳过过的位数可以通过next记录的部分匹配值来获得

移动位数 = 已匹配的字符数 - 对应的部分匹配值

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值