字符串模式匹配

1.Broute-Force算法

    public int indexOfBf(String target,String pattern){
        return indexOfBf(target,pattern);
    }

    public static int indexOfBf(String target,String pattern,int begin){
        int n=target.length(),m=target.length();
        if(begin<0){
            begin=0;
        }
        if(n<0||m<0||n<m||begin<n){
            return -1;
        }
        int i=begin,j=0;
        while(j<pattern.length()-1){
            //若ti与pj元素匹配,则比较下一个元素
            if(target.charAt(i)==pattern.charAt(j)){
                i++;
                j++;
            }
            //若不匹配,模式串回溯到目标串i-j+1的位置
            else{
                i=i-j+1;
                j=0;
                //若模式串长度不够,则结束匹配,匹配失败
                if(m<n-i){
                    break;
                }
            }
        }
        return j==m?i-m:-1;
        
    }

2.KMP算法

    public static int indexOfKMP(String target,String pattern){
        return indexOfKMP(target,pattern,0);
    }

    public static int indexOfKMP(String target,String pattern,int begin){
        int n=target.length(),m=pattern.length();
        if(begin<0){
            begin=0;
        }
        if(n<0||m<0||n<m||begin>n){
            return -1;
        }
        int i=begin,j=0;
        int next[]=getNext(pattern);
        while(j<target.length()-1){
            if(j==-1||target.charAt(i)==pattern.charAt(j)){
                i++;
                j++;
            }
            else {
                j=next[j];
                if(n-i+1<m-j+1){
                    break;
                }
            }
        }
        return j==m?i-m:-1;
    }

2.1求next数组

//求next数组
    public static int[] getNext(String pattern){
        int k=-1,j=0,next[]=new int[pattern.length()];
        next[0]=-1;
        //遍历next数组
        while(j<pattern.length()-1){
            //若pj==pk,next[j]的值是前面前缀字符串长度+1,即k+1;k==-1,指第一个元素
            if(k==-1||pattern.charAt(j)==pattern.charAt(k)){
                k++;
                j++;
                next[j]=k;
            }
            //若pj!=pk,pj与更短的前缀字符串比较,直到比较到最后一个前缀字符串即第一个元素
            else {
                k=next[k];
            }
        }
        return next;
    }

求改进的next数组

    public static int[] getNextImprove(String pattern){
        int k=-1,j=0,next[]=new int[pattern.length()];
        next[0]=-1;
        while(j<pattern.length()-1){
            if(k==-1||pattern.charAt(k)==pattern.charAt(j)){
                k++;
                j++;
                //验证此时的pj是否与pk相等,相等next[j]=next[k]
                if(pattern.charAt(j)==pattern.charAt(k)){
                    next[j]=next[k];
                }
                else{
                    next[j]=k;
                }
            }
            else{
                k=next[k];
            }
        }
        return next;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值