KMP算法Java语言实现

import java.util.Scanner;

public class MainKMP {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        char[] strs = str1.toCharArray();
        char[] strm = str2.toCharArray();
        System.out.println(GetIndex(strs, strm));
    }

    public static int GetIndex(char[] strs, char[] strm) {
        if (strm.length <= 0 || strs.length <= 0 || strm.length > strs.length)
            return -1;
        int[] nextArr = GetNextArray(strm);
        int mi = 0;
        int si = 0;
        while (mi < strm.length && si < strs.length) {
            if (strm[mi] == strs[si]) {
                mi++;
                si++;
            }else if (mi > 0) {
                mi = nextArr[mi];
            } else {
                si++;
            }
        }
        return mi == strm.length ? si - mi : -1;
    }

    public static int[] GetNextArray(char[] str2) {
        if (str2.length < 2) {
            return new int[]{ -1 };
        }
        int[] nextArr = new int[str2.length];
        nextArr[0] = -1;//第一个位置前面没有元素,将其定义为-1
        nextArr[1] = 0;//第二个位置前面只有一个元素,匹配子串的定义是前缀子串不包括最后一个元素,后缀子串不包括第一个元素,因此前面匹配子串的长度为0
        int pos = 2;//下一步进行比较的位置为第三个位置;
        int cn = 0;//cn为上一个字符匹配前缀子串的下一个元素位置;
        while (pos < str2.length) {
            if (str2[pos] == str2[cn]) {
                nextArr[pos++] = ++cn;
            } else if (cn > 0) {
                cn = nextArr[cn];
            } else {
                nextArr[pos++] = 0;
            }
        }
        return nextArr;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖飞_coffee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值