代码营打卡 Day9

 1. KMP算法

kmp算法主要是解决 给出一个文本串 aabaabaaf, 再给一个模式串 aabaaf

看文本串中是否出现模式串, 因为暴力匹配的复杂度过高 O(m*n)

两个指针 j指向前缀末尾位置, j的值还代表i之前(包括i) 子串最长相等前后缀长度

i指向后缀末尾位置

next数组要记录最长相等前后缀长度, 要完成4个任务

1. 先初始化

2. 处理前后缀相同的情况

3. 处理前后缀不同的情况

4. 更新next数组值

void getNext(next, s){

 j= 0; next[0] = 0

}

next第一个位置的数字被设置为0, j从0开始, i从1开始

for (i=1; i<s.size; i++){

    while j>0 && s[i] != s[j]:
        j = next[j-1]
    
    if s[i]==s[j]:
        j++

    next[i] = j
}

如果i和j指到的元素相等, 那么j向后移动一位, next[i], next数组中对应i下标存入j的值, 然后i往后移动一位

如果i, j不相等, j要回退, j前一个next数组所对应的值, 回退到对应的下标, j = next[j-1], 遇到冲突需要连续回退, 所以要用while

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值