Java实现KMP字符串匹配算法(1)

package dataStruct.常用算法;

import java.util.Arrays;

/*

KEP算法————用来解决模式串在文本串中最早出现位置的算法

*/

public class KMP算法解决字符串出现问题 {

public static void main(String[] args) {

    String str1 = "BBC ABCDAB ABCDABCDABDC";

    String str2 = "ABCDABD";

    int[] next = kmpNext(str2);

    System.out.println(str2+"的部分匹配表:"+Arrays.toString(next));

    int index = kmpSearch(str1, str2, next);

    System.out.println(index);

}

//编写一个获取字串部分匹配表的方法

public static int[] kmpNext(String str){

    //创建一个和字符串等长度的数组,用来存放部分匹配表

    int[] next = new int[str.length()];

    next[0] = 0;//因为只有一个元素时,前缀为空,后缀也为空,所以长度为0

    //循环寻找前缀和后缀匹配的字符下标

    for (int i = 1,j = 0; i < str.length(); i++) {

        //当str.charAt(i) != str.charAt(j),并且j > 0时,j = next[j-1];,直到str.charAt(i) == str.charAt(j)

        while (j > 0 && str.charAt(i) != str.charAt(j)){

            j = next[j-1];

        }

        //假如只有两个元素,i=1,j=0,第一个元素和第二个元素匹配,则匹配表为[0,1],比如AA

        /*假如有三个元素ABA,

        从A开始考虑,A的前后缀都为空,所以next[0] = 0;

        考虑AB,前缀A,后缀B,没有共同字串,所以next[1] = 0;

        考虑ABA,前缀A,AB,后缀BA,A,有一个共同字串,并且长度为1,所以next[2] = 1;

        所以ABA的部分匹配表next={0,0,1}

         */

        if (str.charAt(i) == str.charAt(j)){

            j++;

        }

        next[i] = j;

    }

    return next;

}

//写出kmp的搜索算法



/**

 *

 * @param str1 源字符串

 * @param str2 子串

 * @param next 部分匹配表

 * @return 如果没有匹配返回-1,否则返回第一个匹配的位置

 */

public static int kmpSearch(String str1,String str2,int[] next){

    //遍历str1

    for (int i = 0,j= 0; i < str1.length(); i++) {

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-XZNtpUH0-1714358608566)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值