字符串模式匹配

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;
    }
上一篇:六月七号数据库


下一篇:【LeetCode】227. 基本计算器 II(同NC137)