BruteForce
public static void BruteForce(String s, String p) {
char[] origin = s.toCharArray();
char[] pattern = p.toCharArray();
for (int i = 0; i < origin.length; i++) {
boolean eq = true;
for (int j = 0; j < pattern.length; j++) {
if (pattern[j] != origin[i + j]) {
eq = false;
break;
}
}
if (eq) {
System.out.println(i);
break;
}
}
}
kmp 算法
- kmp算法
- 构建next数据
- 第1,2 位为0;next数组 i 位置 代表i 0到i-1之间的字符串;前缀和后缀匹配的长度;
- 匹配长度刚好可以作为下次比较的下标
- 例子 cbacbd 对应的数组为 0,0,0,0,1,2;
- 进行匹配时,如若和i位置不相等,则可以和nexti位置相比较 ;i位置 和nexti位置可能相等,也可能不想等
- while 循环要放在前面;若放在相等后面,则相等操作,j会增加,while循环会对新的值进行比较
- 实际比较
- 相等时,i,j位置都变;不相等时,要保证i位置不变,j位置改变
- j位置可以直接修改为 nexti
- 最后取值时,为i-j+1;
public int[] getNext(String str) {
int[] next = new int[str.length()];
int j = 0;
char[] chars = str.toCharArray();
for (int i = 2; i < chars.length; i++) {
while (j > 0 && chars[i - 1] != chars[j]) {
j = next[j];
}
if (chars[j] == chars[i - 1]) {
j++;
}
next[i] = j;
}
return next;
}
public int kmp(String str, String pattern) {
int[] next = getNext(pattern);
char[] chars = str.toCharArray();
int j = 0;
int i = 0;
while (i < chars.length) {
if (j == 0 || chars[i] == pattern.charAt(j)) {
j++;
i++;
} else {
j = next[j];
}
if (j == pattern.length()) {
return i - pattern.length() + 1;
}
}
return -1;
}