public static void main(String[] args) {
String s = "ABCDABDEBBC ABCDAB ABCDABCDABDE";
String p = "ABCDABD";
System.out.println(match(s, p));
}
public static List<Integer> match(String s, String p) {
int[] ints = buildPrefix(p);
int pi = 0;
int si = 0;
List<Integer> ans = new ArrayList<>();
while (si < s.length()) {
//匹配上就往后移动
while (pi < p.length() && si < s.length() && s.charAt(si) == p.charAt(pi)) {
si++;
pi++;
}
//完全匹配上了
if (pi == p.length()) {
//si当把当前位置- p的长度就是匹配最开始IDE位置
ans.add(si - p.length());
//当前位置往后走
pi = ints[pi - 1];
} else {
//没有匹配上就往后走
si++;
//部分匹配的话
if (pi > 0) {
pi = ints[pi - 1];
//无匹配肯定就是第一个位置,永远是0的位置
} else {
pi = ints[0];
}
}
}
return ans;
}
public static int[] buildPrefix(String p) {
char[] prfix = p.toCharArray();
int[] ans = new int[p.length()];
int index = 1;
ans[0] = 0;
while (index < p.length()) {
if (ans[index - 1] > 0) {
if (prfix[ans[index - 1]] == prfix[index]) {
ans[index] = ans[index - 1] + 1;
} else {
ans[index] = 0;
}
} else {
if (prfix[0] == prfix[index]) {
ans[index] = 1;
}
}
index++;
}
return ans;
}