java实现字符串kmp算法

本文详细介绍了KMP算法的实现过程,包括next数组的计算、字符串匹配的基本原理及应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package test;

public class StringKMP {

    public void getNextBetter(String str, int[] next){        
        int len = str.length();
        next[1] = 0;
        int i = 1;
        int j = 0;
        while(i < len - 1){
            if(j == 0 || str.charAt(i) == str.charAt(j)){
                ++ i;
                ++ j;
                if(str.charAt(i) != str.charAt(j)){
                    next[i] = j;
                } else{
                    next[i] = next[j];
                }
                
            } else {
                j = next[j];
            }
        }        
    }
    public void getNext(String str, int[] next){        
        int len = str.length();
        next[1] = 0;
        int i = 1;
        int j = 0;
        while(i < len - 1){
            if(j == 0 || str.charAt(i) == str.charAt(j)){
                ++ i;
                ++ j;
                next[i] = j;
            } else {
                j = next[j];
            }
        }        
    }
    public int getIndex(String strLong, String strShort, int pos){
        
        int lenLong = strLong.length();
        int lenShort = strShort.length();    
        
        strLong = "x" + strLong;
        strShort = "x" + strShort;
        
        int[] next = new int[lenShort + 1];
        this.getNextBetter(strShort, next);
        
        int i = pos + 1;
        int j = 1;
        
        while(i <= lenLong && j <= lenShort){
            if(j == 0 || strLong.charAt(i) == strShort.charAt(j)){
                ++ i;
                ++ j;
            } else{
                j = next[j];
            }
        }
        if(j > lenShort)
            return i-lenShort-1;
        else
            return 0;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String strLong = "ertsafabaabcacseadfsdg";
        String strShort = "abaabcac";
        
        StringKMP kmp = new StringKMP();
        
        int index = kmp.getIndex(strLong,strShort,0);
        System.out.println(index);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值