KMP模式匹配算法学习

来源:互联网 发布:淘宝床品拍摄灯光布置 编辑:程序博客网 时间:2024/06/05 18:44

1、计算返回字符串的next[]数组,2、查找字符串。

自己写了个恶心的,不知道有没有用。。。

public static void main(String[] args) { String textString = "ababadaababaaa"; String findString = "ababaaa"; System.out.println(findByNext(textString, findString)); System.out.println(textString.indexOf(findString));}private static void get_next(String T, int next[]) {int i = 1;int j = 0;next[1] = 0;while (i < T.length()) {if (j == 0 || T.charAt(i - 1) == T.charAt(j - 1)) {++i;++j;next[i] = j;} else {j = next[j];}}}private static int findByNext(String text, String find) {int r = 0;int next[] = new int[255];get_next(find, next);for (int i = 0; i <= (text.length() - find.length()); i++) {if (text.charAt(i) == find.charAt(0)) {for (int j = 1; j < find.length(); j++) {if (text.charAt(i + j) != find.charAt(j)) {j = find.length();i = i + next[j];// KMP算法将i的位置外后移,减少不必要的回溯} else if (j == find.length() - 1) {r = i;i = text.length();break;}}}}return r;}

虽然感觉和书上的比好像比书上的复杂多了,但起码这个是自己写的嘛- -,虽然不知道对不对。

顺带把书上的例子也贴上。


例子1

private static int indexKMP(String S, String T) {int i = 1;int j = 1;int next[] = new int[255];get_index(T, next);while (i < S.length() && j < T.length()) {if (j == 0 || S.charAt(i - 1) == T.charAt(j - 1)) {++i;++j;} else {j = next[j];}}if (j >= T.length()) {return i - T.length();} else {return 0;}}


例子2,改进后的KMP

private static void get_nextval(String T, int nextval[]) {int i = 1;int j = 0;nextval[1] = 0;while (i < T.length()) {if (j == 0 || T.charAt(i - 1) == T.charAt(j - 1)) {++i;++j;if (T.charAt(i - 1) != T.charAt(j - 1)) {nextval[i] = j;} else {nextval[i] = nextval[j];}} else {j = nextval[j];}}}


原创粉丝点击