字符串匹配
暴力匹配
public static int violent(String text, String pattern) {
int i = 0;
int j = 0;
while (i < text.length()) {
while (j < pattern.length() && text.charAt(i) == pattern.charAt(j)) {
i++;
j++;
}
if (j == pattern.length()) {
return i - j;
} else {
i = i - j + 1;
j = 0;
}
}
return -1;
}
kpm
生成next数组
public static int[] getNextArr(String patternStr) {
char[] pattern = patternStr.toCharArray();
int[] next = new int[pattern.length];
next[0] = -1;
int k = -1;
int j = 0;
while (j < pattern.length - 1) { //j从零开始,next[j]赋值前 j先自增
if (k == -1 || pattern[j] == pattern[k]) {
j++;
k++;
next[j] = k;
} else {
k = next[k];
}
}
return next;
}
kpm匹配
public static int kpmMatch(String textStr, String patternStr) {
char[] text = textStr.toCharArray();
char[] pattern = patternStr.toCharArray();
int[] next = getNextArr(patternStr);
int i = 0;
int j = 0;
while (i < text.length) {
if (j == -1 || text[i] == pattern[j]) {
i++;
j++;
} else {
j = next[j];
}
if (j == pattern.length) {
return i - j;
}
}
return -1;
}