-
使用String内置的方法实现模式匹配【时间复杂度O(m×(n−m+1))≈O(mn)O(m\times(n-m+1))\approx O(mn)O(m×(n−m+1))≈O(mn)】:
public static int index(String str, String find) { String sub; for (int i = 0; i <= str.length() - find.length(); ++i) { sub = str.substring(i, i + find.length()); if (find.compareTo(sub) == 0) return i; } return -1; }
-
朴素的模式匹配算法【时间复杂度O(m×(n−m+1))≈O(mn)O(m\times(n-m+1))\approx O(mn)O(m×(n−m+1))≈O(mn)】:
public static int index(String str, String find) { int k = 0; int i = 0, j = 0; while (i < str.length() && j < find.length()) { if (str.charAt(i) == find.charAt(j)) { ++i; ++j; } else { ++k; i = k; j = 0; } } if (j == find.length()) return k; return -1; }
-
KMP模式匹配算法【时间复杂度O(m+n)O(m+n)O(m+n)】:
public static int index(String str, String find) { // 计算模式串的next数组 int next[] = new int[find.length()]; int m = 0, n = -1; // 错位 next[0] = -1; while (m < find.length() - 1) { if (n == -1 || find.charAt(m) == find.charAt(n)) { ++m; ++n; next[m] = n; } else n = next[n]; } // 开始匹配 int i = 0, j = 0; while (i < str.length() && j < find.length()) { if (j == -1 || str.charAt(i) == find.charAt(j)) { ++i; ++j; } else j = next[j]; } if (j == find.length()) return i - find.length(); return -1; }