本题第一种算法是暴力解,比较容易解决,也是本题的标准答案。
class Solution {
public int strStr(String haystack, String needle) {
int m = haystack.length();
int n = needle.length();
char[] s = haystack.toCharArray();
char[] p = needle.toCharArray();
if (n == 0) return 0;
for (int i = 0; i <= m - n; i ++) {
int b = 0;
int a = i;
for (int j = 0; j < n; j ++) {
if (s[a] == p[b]) {
a++;
b++;
}
}
if (b == n) return i;
}
return -1;
}
}
本题的难点是第二种做法,第一次接触,KMP算法,这有几个参考资料。
本题的解决:
1、转换成char
2、构建next数组,套用模板
3、与主串比较匹配,套用模板
class Solution {
// KMP 算法
// ss: 原串(string) pp: 匹配串(pattern)
public int strStr(String ss, String pp) {
if (pp.isEmpty()) return 0;
// 分别读取原串和匹配串的长度
int n = ss.length(), m = pp.length();
// 原串和匹配串前面都加空格,使其下标从 1 开始
ss = " " + ss;
pp = " " + pp;
char[] s = ss.toCharArray();
char[] p = pp.toCharArray();
// 构建 next 数组,数组长度为匹配串的长度(next 数组是和匹配串相关的)
int[] next = new int[m + 1];
// 构造过程 i = 2,j = 0 开始,i 小于等于匹配串长度 【构造 i 从 2 开始】
for (int i = 2, j = 0; i <= m; i++) {
// 匹配不成功的话,j = next(j)
while (j > 0 && p[i] != p[j + 1]) j = next[j];
// 匹配成功的话,先让 j++
if (p[i] == p[j + 1]) j++;
// 更新 next[i],结束本次循环,i++
next[i] = j;
}
// 匹配过程,i = 1,j = 0 开始,i 小于等于原串长度 【匹配 i 从 1 开始】
for (int i = 1, j = 0; i <= n; i++) {
// 匹配不成功 j = next(j)
while (j > 0 && s[i] != p[j + 1]) j = next[j];
// 匹配成功的话,先让 j++,结束本次循环后 i++
if (s[i] == p[j + 1]) j++;
// 整一段匹配成功,直接返回下标
if (j == m) return i - m;
}
return -1;
}
}
加一句,暂时再也不想看到kmp算法了,浪费了我两个上午==