2021-04-20 28. 实现 strStr() [KMP算法]

KMP算法

用于在字符串A中寻找是否出现过字符串B

第一步:求最长公共前后缀长度,构建Prefix Table

在这里插入图片描述

public static void getPrefixTable(char[] pattern,int[] prefix){
        int n = pattern.length;
        assert n>0;
        // 每次填充一个prefix的值
        prefix[0]=0;
        for(int i=1,len=0;i<n;i++){
            while(len>0 && pattern[len]!=pattern[i]){
                len = prefix[len-1];
            }
            if(pattern[len]==pattern[i]){
                len++;
                prefix[i]=len;
            }
            prefix[i]=len;
        }
    }

第二步:利用Prefix Table完成KMP算法

  • 如果Text[i]!=pattern[0] (j==0)
    • i++;
  • 否则,
    • 先利用Prefix Table完成跳跃在这里插入图片描述
    • 然后判断(因为有可能跳到最后j=0,依旧有可能Text[i]!=pattern[j]),如果Text[i]==pattern[j]
      • j++
    • 如果j==m
      • return true;

28. 实现 strStr() [KMP算法🌟]

class Solution {
    public int strStr(String haystack, String needle) {
        int n = haystack.length(), m = needle.length();
        if(m==0) return 0;
        // 构建Prefix Table,注意要从第2个元素开始
        int[] prefix = new int[m];
        for(int i=1,len=0;i<m;i++){
            while (len>0 && needle.charAt(i)!=needle.charAt(len)){
                len = prefix[len-1];
            }
            if(needle.charAt(i)==needle.charAt(len)){
                len++;
            }
            prefix[i]=len;
        }
        // KMP
        for(int i=0,j=0;i<n;i++){
            while(j>0 && haystack.charAt(i)!=needle.charAt(j)){
                j = prefix[j-1];
            }
            if(haystack.charAt(i)==needle.charAt(j)){
                j++; //因为i自动++
            }
            if(j==m)
                return i-m+1; //计算到开头的位置,此时i在最后一个字符的位置。
        }
        return -1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值