现在的位置: 首页 > 综合 > 正文

KMP模式匹配算法学习

2018年04月06日 ⁄ 综合 ⁄ 共 1343字 ⁄ 字号 评论关闭

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];
			}
		}
	}

抱歉!评论已关闭.