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;
}