数据结构之串,next和nextval计算及KMP算法(java实现)

数据结构之串,next和nextval计算及KMP算法(java实现)

public class SString {
    String [] ch;
    int lenght;
    int MaxLen;
    SString(int maxLen){
        this.MaxLen=maxLen;
        this.ch=new String[maxLen];
        this.lenght=this.ch.length;
    }

    @Override
    public String toString() {
        return "SString{" +
                "ch=" + Arrays.toString(ch) +
                ", lenght=" + lenght +
                '}';
    }
    //
    public static void main(String[] args) {
     System.out.println("----------------------next,nextval----------------------------------");
        String [] arr3 = {"a","b","a","c","b","b","a"};
        SString T1=CreatSstring(arr3);
        int [] j= new int[T1.lenght];
       for (int i=0;i<T1.lenght;i++){
           j[i]=i+1;
       }
        System.out.println("j         :"+Arrays.toString(j));
        System.out.println("模式串     :"+Arrays.toString(T1.ch));
        int [] next1 = new int[T1.lenght];
        get_next(T1,next1);
        int [] nextval = new int[T1.lenght];
        get_nextval(T1,nextval);

        System.out.println("----------------------KMP算法----------------------------------");
        String [] arr = {"a","b","a","c","b","b","a"};
        SString T=CreatSstring(arr);
        String [] arr1 = {"c","b","b"};
        SString S=CreatSstring(arr1);
        int [] next = new int[S.lenght];
        System.out.println("----------------KMP,next-----------------");
        System.out.println("S在T中第一次出现位置(下标:"+Index_KMP(T,S, get_next(S,next)));
        int [] nextval1 = new int[S.lenght];
        System.out.println("---------------KMP,nextval----------------");
        System.out.println("S在T中第一次出现位置(下标:"+Index_KMP(T,S, get_nextval(S,nextval1)));



    }
    //创建串
    public static SString CreatSstring(String [] arr){
        SString S= new SString(arr.length);
        for (int i=0;i<arr.length;i++){
            S.ch[i]=arr[i];
        }
        return S;
    }
    //计算nextval值
    public static int [] get_nextval(SString T,int [] nextval){
        int i=0,j=-1;
        nextval[0]=-1;
        while (i<T.lenght-1){
            if(j==-1 || T.ch[i]==T.ch[j]){
                ++i;++j;
                if (T.ch[i]!=T.ch[j]) {
                    nextval[i]=j;
                }
                else{
                    nextval[i]=nextval[j];
                }

            }else {
                j=nextval[j];
            }
        }
        for (int k=0;k<nextval.length;k++){
            ++nextval[k];
        }
        System.out.println("nextval[j]:"+Arrays.toString(nextval));
        return nextval;
    }
    //计算next值
    public static int [] get_next(SString T,int [] next){
        int i=0,j=-1;
        next[0]=-1;
        while (i<T.lenght-1){
            if(j==-1 || T.ch[i]==T.ch[j]){
                ++i;++j;
                next[i]=j;
            }else {
                j=next[j];
            }
        }
        for (int k=0;k<next.length;k++){
            ++next[k];
        }
       System.out.println("next[j]   :"+Arrays.toString(next));
        return next;
    }
    //kMP算法
    public static int Index_KMP(SString S,SString T,int [] next){
        int i=0,j=0;
        while (i<S.lenght && j<T.lenght){
            if(j==-1 || S.ch[i]==T.ch[j]){
                ++i;++j;
            }else {
                j=next[j]-1;
            }

        }

        if(j>=T.lenght){
            return i-T.lenght;
        }
        else {
            return 0;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值