kmp字符出模式匹配java实现

来源:互联网 发布:巴基实力 知乎 编辑:程序博客网 时间:2024/05/04 18:10
public class KMP {
static char[] string = {'a','b','c','d','a','b','a','d','e','t','g','p','b','z','h','m','q'};
static char[] subString = {'b','c','z','a'};
public static void main(String[] args) {
System.out.println("indexof:"+match(string,subString));
}
static int[] prePro(char[] subString){
int length = subString.length;
int [] result = new int[length];
result[0] = 0;
result[1] = 0;
int i=2;
while(i<length){
if(subString[result[i]]==subString[i-1]){
result[i] = result[i-1]+1;
}else{
for(int j=0;j<i-1;j++){
char[] temp1 = new char[j+1];
char[] temp2 = new char[j+1];
for(int k=0;k<=j;k++){
temp1[k] = subString[k];
temp2[k] = subString[i-j+k-1];
}
System.out.print("temp1:");
for(int k=0;k<temp1.length;k++){
System.out.print(temp1[k]);
}
System.out.println();
System.out.print("temp2:");
for(int k=0;k<temp1.length;k++){
System.out.print(temp2[k]);
}
System.out.println();
int n = equals(temp1,temp2);
if(result[i]<n){
result[i] = n;
}
}
}
i++;
}
System.out.print("next:");
for(int n:result){
System.out.print(n);
}
return result;
}
static int equals(char[] string1,char[] string2){
if(string1.length!=string2.length){
return 0;
}
int i = 0;
for(i=0;i<string1.length;i++){
if(string1[i]!=string2[i]){
break;
}
}
if(i<string1.length){
return 0;
}else{
return i;
}
}
public static int match(char[] string,char[] subString){
int result = -1;
if(string.length<subString.length){
return result;
}
int[] next = prePro(subString);
int i=0,j=0;
while(j<=string.length-subString.length&&i<subString.length){
if(string[j]==subString[i]){
j++;
i++;
}else{
if(i!=0){
if(subString[i]==subString[0]){
j++;
}
i = next[i];
}else{
j++;
}
}
}
if(i==subString.length){
result = j-subString.length;
}
System.out.println();
return result;
}
}
0 0