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

来源:互联网 发布:物流app软件排名 编辑:程序博客网 时间:2024/05/18 16:36

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             //匹配失败,返回-1return -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             //匹配失败,返回-1return -1;}




原创粉丝点击