1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import java.util.*;
class Program { public static boolean knuthMorrisPrattAlgorithm(String string, String substring) { int[] pattern = buildPattern(substring); return doesMatch(string, substring, pattern); }
public static int[] buildPattern(String substring) { int[] pattern = new int[substring.length()]; Arrays.fill(pattern, -1); int j = 0, i = 1; while (i < substring.length()) { if (substring.charAt(i) == substring.charAt(j)) { pattern[i] = j; i += 1; j += 1; } else if (j > 0) { j = pattern[j - 1] + 1; } else { i += 1; } } return pattern; }
public static boolean doesMatch(String string, String substring, int[] pattern) { int i = 0, j = 0; while (i + substring.length() - j <= string.length()) { if (string.charAt(i) == substring.charAt(j)) { if (j == substring.length() - 1) return true; i += 1; j += 1; } else if (j > 0) { j = pattern[j - 1] + 1; } else { i += 1; } } return false; } }
|