package jiegouSuanfa;
/**
* KMP算法字符串匹配
* @author 97699
*
*/
public class KMP {
/**
* 暴力方法
* @param lstr
* @param str
* @return
*/
public static int bl(String lstr,String str) {
char[] a=lstr.toCharArray();
char[] b=str.toCharArray();
int i=0;
int j=0;
while(i<a.length&&j<b.length) {
if(a[i]==b[j]) {
i++;
j++;
}else {
i=i-j+1;
j=0;
}
}
if(j==b.length) {
return i-j;
}else {
return -1;
}
}
public static void main(String[] args) {
String lstr="abcabdadf";
String str="bdad";
int m=bl(lstr,str);
int n=KMP(lstr,str);
System.out.println("暴力方法求解:"+m);
System.out.println("KMP:"+n);
}
public static int KMP(String lstr, String str) {
// TODO Auto-generated method stub
char[] a=lstr.toCharArray();
char[] b=str.toCharArray();
int al=a.length;
int bl=b.length;
int i=0;
int j=0;
//获得next
int [] next = new int[bl];
next[0]=-1;
int L=-1;
int R=0;
while(R<bl-1) {
if(L==-1||b[L]==b[R]) {
L++;
R++;
next[R]=L;
}else {
L=next[L];
}
}
while(i<al&&j<bl) {
if(j==-1||a[i]==b[j]) {
i++;
j++;
}
else {
j=next[j];
}
}
if(j==bl) {
return i-j;
}else {
return 0;
}
}
}