KMP算法实现

KMP算法实现

参考博客:https://blog.youkuaiyun.com/gao506440410/article/details/81812163

package MyOffer;

import java.util.Scanner;

/**
 * 字符字串查找算法:KMP实现
 * 参考博客:https://blog.youkuaiyun.com/gao506440410/article/details/81812163
 */

public class KMP {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String textStr=in.nextLine();
        String patternStr=in.nextLine();
        System.out.println(Kmp(textStr,patternStr));
    }

    /** 从文本串中找到模式串的开始位置
     * @param textStr 文本串
     * @param patternStr 模式串
     * @return 文本串中包含模式串,返回模式串第一次出现的首字符的位置;否则返回-1
     */
    public static int Kmp(String textStr, String patternStr){
        char[] text=textStr.trim().toCharArray();
        char[] pattern=patternStr.trim().toCharArray();
        int[] next=getNext(pattern);
        int textIndex=0;
        int patInext=0;
        while(textIndex<text.length&&patInext<pattern.length){
            if(patInext==-1||text[textIndex]==pattern[patInext]){
                textIndex++;
                patInext++;
            }else{
                patInext=next[patInext];
            }
        }
        if(patInext==pattern.length){
            return textIndex-patInext;
        }else
            return -1;
    }
    private static int[] getNext(char[] pattern){
        int[] next = new int[pattern.length];
        int k=-1;
        int j=0;
        next[0]=-1;
        while(j<next.length-1){
            if(k==-1||pattern[j]==pattern[k]){
                k++;
                j++;
                if(pattern[j]!=pattern[k]){
                    next[j]=k;
                }else{
                    next[j]=next[k];
                }
            }else{
                k=next[k];
            }
        }
        return next;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值