java实现Brute-Force和KMP模式匹配

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/benzhaohao/article/details/78391220

Brute-Force模式匹配算法

从主串第start(i=start)个字符起,与模式串t的第一个字符(j=0)开始比较。

若相等,则继续比较后面字符(i++,j++)

若不相等,则从主串第二个字符起重新和模式串t比较(i=i-j+1,j=0)

若都匹配成功,则返回模式串t第一个字符在主串的位置

否则返回-1

public int index_BF(IString t,int start){  //t为模式串
		int slen=this.length();
		int tlen=t.length();
		int i=start;
		int j=0;
		while(i<slen&&j<tlen){    
			if(this.charAt(i)==t.charAt(j)){   //j为模式串当前字符下标
 				i++;
				j++;
			}
			else{
				i=i-j+1;    //继续比较后续字符
				j=0;   //模式串下标回退到0
			}
		}
		if(j>=t.length())    //匹配成功,返回子串序号
			return i-tlen;
		else             //匹配失败,返回-1
			return -1;
		
	}
KMP模式匹配

个人感觉以下这篇文章不错,举了一个例子来理解KMP,简单直观,不过他是用c写的

下面我用java实现

点击打开链接

首先建立next[]函数

//next[0]=-1表示0个元素,不存在前后缀
    //next[1]=0表示有一个元素,前后缀长度为0
    //next[2]=1表示有两个元素,前后缀长度为1
    public int[] getnext(IString T){
        int[]next=new int[T.length()];  //next数组
        int j=1;    //主串指针
        int k=0;     //模式串指针
        next[0]=-1;
        next[1]=0;
        while(j<T.length()-1){   
            if(T.charAt(j)==T.charAt(k)){   //匹配
                next[j+1]=k+1;
                k++;
                j++;
            }
            else if(k==0){   //失配
                next[j+1]=0;
                j++;
            }
            else
                k=next[k];
        }
        return(next);
    }
KMP算法实现

public int index_KMP(IString T,int start){
		int[]next=getnext(T);  //计算模式串的next【】函数值
		int i=start;
		int j=0;
		while(i<this.length()&&j<T.length()){ //从左到右依次比较
			if(j==0||this.charAt(i)==T.charAt(j)){  //j==0表示S[i]!=T[0]则转到下一字符
				i++;
				j++;
			}
			else   //当S[i]!=T[j]时,模式串右移
				j=next[j];
		}
		if(j<T.length())   //匹配失败
			return -1;
		else              //匹配成功
			return(i-T.length());   
	}
	public int index_BF(IString t,int start){  //t为模式串
		int slen=this.length();
		int tlen=t.length();
		int i=start;
		int j=0;
		while(i<slen&&j<tlen){    
			if(this.charAt(i)==t.charAt(j)){   //j为模式串当前字符下标
 				i++;
				j++;
			}
			else{
				i=i-j+1;    //继续比较后续字符
				j=0;   //模式串下标回退到0
			}
		}
		if(j>=t.length())    //匹配成功,返回子串序号
			return i-tlen;
		else             //匹配失败,返回-1
			return -1;
		
	}




猜你喜欢

转载自blog.csdn.net/benzhaohao/article/details/78391220
今日推荐