您的位置:首页 > 编程语言 > Java开发

字符串搜索的KMP算法实现(java版)

2013-05-02 15:32 537 查看
刚才看到新闻频道转截的一篇文章:阮一峰:字符串匹配的KMP算法,图文并茂通俗易懂,就用java实现了一下

对于我这个只会排序算法的人来说,也算是一个比较难的任务了。

上次写的逻辑有问题,这次不知道有没有bug。

/**
* Knuth-Morris-Pratt 算法
*
* @author yinqi
* @date 2013-5-5 - 上午11:11:56
*/
public class StringSearchKMP {

/**
* @param args
*/
public static void main(String[] args) {
int index = knuthMorrisPratt("ABCDABABCDAABCDABCABCDABDABD",
"ABCDABDABD", 0);
System.out.println(index);
}

/**
* 字符串搜索KMP算法 <br>
*
* @param searchStr
* @param matchStr
* @param start
* @return
*/
public static int knuthMorrisPratt(String searchStr, String matchStr,
int start) {
char[] searchchar = searchStr.toCharArray();
char[] mchar = matchStr.toCharArray();
int[] fixNum = lengthKMP(mchar);
System.out.println(Arrays.toString(fixNum));
int neglect = 1;
for (int i = start; i <= searchchar.length - mchar.length; i += neglect) {
boolean con = true;
for (int j = 0; j < mchar.length; j++) {
if (searchchar[i + j] != mchar[j]) {
con = false;
neglect = j + 1 - fixNum[j == 0 ? 0 : j - 1];
break;
}
}
if (con) {
return i + 1;
}
}
return -1;
}

/**
* 获取部分匹配值的共有元素的长度 <br>
*
* @param mchar
* @return
*/
public static int[] lengthKMP(char[] mchar) {
int[] fixNum = new int[mchar.length];
for (int i = 1, j = 0; i < mchar.length; i++) {
if (mchar[j] == mchar[i]) {
fixNum[i] = j + 1;
j++;
} else if (j > 0) {
j = 0;
i -= j;
}
}
// return [0, 0, 0, 0, 1, 2, 0, 1, 2, 0]ABCDABDABD
return fixNum;
}
}
/*
* A BC
* AB C
* A BCD
* AB CD
* ABC D
* A BCDE
* AB CDE
* ABC DE
* ABCD E
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: