KMP算法详解

状态机示例:

 

算法步骤:

  1. 建立状态机 build(String pattern) 状态机只与pattern有关

    dfa数组内涵和关系:dfa[当前状态][将要遇到的字符]=dfa[下一个状态]

    重启状态:当于第i个元素不匹配时,需要进行回溯;本来暴力算法要回溯到第1个元素,但现在将第1到第i-1元素的子串输入状态机,得到的状态为KMP的重启状态,从这个状态开始匹配减少无用的回溯。参考链接

    1. 初始状态base cases:dfa[0][pattern.charAt(0)]=1

    2. 遍历pattern,匹配成功(j==pattern.charAt(i))状态转移:dfa[i][pattern.charAt(i)]=i+1

    3. 遍历pattern,匹配失败状态重启(restart state):dfa[i][j]=pre;

    4. pre初始化为0, 遍历pattern,定义完当前i的下一个状态后,进行重启状态X的转移:pre=dfa[pre][pattern.charAt(i)]

  2. 查找子串 search(String txt, String pattern)

    1. 从被匹配的文本(txt)头部开始查找,查到最后一个状态就“匹配成功”

    2. 否则,直到txt被匹配完还没有查找最后状态,就“匹配失败”

    3. 匹配成功后返回目前查找的位置i和pattern.length的差值+1(i-pattern.length+1),得到子串头部匹配位置 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值