算法之匹配:KMP

public static int getIndexOf(String s, String m) {
		if (s == null || m == null || m.length() < 1 || s.length() < m.length()) {
			return -1;
		}
		char[] ss = s.toCharArray();
		char[] ms = m.toCharArray();
		int si = 0;
		int mi = 0;
		int[] next = getNextArray(m);
		while (si < ss.length && mi < ms.length) {
			if (ss[si] == ms[mi]) {
				si++;
				mi++;
			} else if (next[mi] == -1) {
				si++;
			} else {
				mi = next[mi];
			}
		}
		return mi == ms.length ? si - mi : -1;
	}

	public static int[] getNextArray(String str) {
		if (str.length() == 1) {
			return new int[]{-1};
		}
		char[] str2 = str.toCharArray();
		int[] next = new int[str.length()];
		next[0] = -1;
		next[1] = 0;
		int pos = 2;
		int cn = 0;
		while (pos < str.length()) {
			if (str2[pos - 1] == str2[cn]) {
				next[pos] = cn + 1;
				pos++;
				cn++;
			} else if (cn > 0) {
				cn = next[cn];
			} else {
				next[pos] = 0;
				pos++;
			}
		}
		return next;
	}

  

猜你喜欢

转载自www.cnblogs.com/a154627/p/10221022.html