KMP是字符子串的查找算法
代码:
public class KMP {
/**
* 暴力搜索
* @param source 源串
* @param pattern 匹配串
* @return
*/
public static int roughSearch(String source, String pattern){
int m = source.length();
int n = pattern.length();
if(m < n)
return -1;
int j=0;
for(int i=0; i<=m-n; i++){
for(j=0;j<n;j++){
if(pattern.charAt(j) != source.charAt(i+j)){
break;
}
}
if(j == n)
return i;
}
return -1;
}
/**
* Compute lps array to maintain size of suffix which is same as prefix
* get the array that stores the longest subarray whose prefix is also its suffix
* @param pattern
* @return
*/
private int[] computeLpsArray(char pattern[]){
int [] lps = new int[pattern.length];
int index =0;
for(int i=1; i < pattern.length;){
if(pattern[i] == pattern[index]){
lps[i] = index + 1;
index++;
i++;
}else{
if(index != 0){
index = lps[index-1];
}else{
lps[i] =0;
i++;
}
}
}
return lps;
}
/**
*
* @param text
* @param pattern
* @return
*/
public int doKMP(char []text, char []pattern){
int lps[] = computeLpsArray(pattern);
int i=0;
int j=0;
int m = text.length;
int n = pattern.length;
while(i < m && j < n){
if(text[i] == pattern[j]){
i++;
j++;
}else{
if(j!=0){
j = lps[j-1];
}else{
i++;
}
}
}
if(j == n){
return i-n;
}
return -1;
}
public static void main(String[] args) {
KMP kmp = new KMP();
String S = "goodgoogle";
String T = "google";
int index = kmp.doKMP(S.toCharArray(), T.toCharArray());
if(index > 0){
System.out.printf("find substrring, index is %d.", index);
}else{
System.out.printf("Not found the substring!! code: %d", index);
}
}
}