字符串查找——KMP算法
java源码:
public class KMP {
//pattern 原字符串,prefix 每个字符对应重复的字符个数,n字符串长度
public static void prefix_table(char []pattern,int[]prefix,int n){
prefix[0]=0;
for(int i=1;i<n;i++){
int j=i; //j:比较位置
while(j>0){//若与前一个字符的prefix对应位置的字符j不相等,则再
//与j前一个字符的prefix对应的值的字符对比
j=prefix[j-1];
if(pattern[i]==pattern[j]){
prefix[i]=j+1;//最后如果 一个相等的都没找到,结果就为默认值0.
break;
}
}
}
int m=prefix.length;
for(int j=m-1;j>0;j--){
prefix[j]=prefix[j-1];
}
prefix[0]=-1;
}
public static void move_prefix_table(int[]prefix,int n){
}
public static void KMP_search(char[]pattern,char[]text){
//n ,m分别表示 pattern,text 的字符长度
int n=pattern.length;
int m=text.length;
int prefix[]=new int[n];
prefix_table(pattern,prefix,n);
int i=0,j=0;//分别指向pattern 和 text 的首位置
while(j<m){
//System.out.println(i+" "+j);
if(i==n-1&&pattern[i]==text[j]){
System.out.println("找到位置:"+(j-i));
i=prefix[i];
}
if(pattern[i]==text[j]){
i++;
j++;
}else{
i=prefix[i];
if(i==-1){//当第一个元素都不相等的时候,i指向pattern中第一个元素,j指向text中的下一个元素。
i=0;
j++;
}
}
}
}
public static void main(String[] args) {
char []pattern="A".toCharArray();
char[]text="BABC".toCharArray();
KMP_search(pattern,text);
}
}