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