字符串匹配(KMP算法)

字符串匹配(KMP算法)

//KMP算法:从模式串上获得next数组(最长前缀),匹配出错的最优处理
private static void GetNext(int[] next, String mapper){  //next数组对应字符串s的每一位
    int k = -1, index = 0;   //k记录上一次最长前缀的下一位
    next[0] = -1;   //模式串的第一个设为-1

    while (index < mapper.length()){
        if(k == -1 || mapper.charAt(index) == mapper.charAt(k)){
            index++; k++;   //往下一位放最长匹配前缀的数量
            if(index == mapper.length()) break; //当最末元素有机会进入该判断内时,会越界

            //方法一:(防止连续相等的字符,在匹配的时候没必要多出重复步骤)
            //如果当前位与最长匹配前缀的下一位也相同,那么一旦匹配出错,那么该最长匹配前缀的下一位也一定出错,可以直接退回到next[最长前缀的下一位]
            int temp = k;
            while (mapper.charAt(index) == mapper.charAt(temp) && temp != 0)
                temp = next[temp];

            next[index] = temp;

            //方法二:(防止连续相等的字符,在匹配的时候没必要多出重复步骤,但此方法只是减少了部分)
            /*if(mapper.charAt(index) != mapper.charAt(k)){
                next[index] = k;
            }
            else
                next[index] = next[k];*/

            //方法三:
            //next[index] = k;
        }
        else k = next[k];
    }
}

//KMP算法:将模式串和主串利用next数组匹配,有就返回开始匹配字符的下标,没有返回-1
private static int KMPIndex(String major, String mapper){
    int[] next = new int[1000];
    int i = 0, j = 0;
    GetNext(next, mapper);

    while (i < major.length() && j < mapper.length()){
        if(j == -1 || major.charAt(i) == mapper.charAt(j)){
            i++; j++;
        }
        else j = next[j];
    }

    if(j >= mapper.length())
        return i - mapper.length();

    return -1;
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String major = in.nextLine();
    String mapper = in.nextLine();

    int index = KMPIndex(major, mapper);
    System.out.println(index);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值