这些天一直在回顾 LeetCode 上刷过的题,当看到第 28 题实现 strStr() 时,我发现虽然它是简单题,可以使用 Java 的 indesOf() 和暴力遍历轻松的解答,但是更好也更为符合实际的应该是用 KMP 算法。关于什么是 KMP 算法,大家可以自己去 google,或者参考严蔚敏老师的《数据结构》。
这里我要分享的只是简单的实现以及其它大佬的解题思路(因为我现在对 KMP 算法理解的也不够深入)。
KMP 算法的大体思路可以参考KMP 字符串匹配算法
个人认为视频讲解比画图讲解会好一点,毕竟视频是动态的。
KMP 算法中的重难点是 next 数组的生成以及具体实现中模式串匹配。具体可以参考一下文章。珠玉在前,我就不分享自己还不够清晰完整的思路了。等我有了更为深入的理解后会来补充这一部分。
以下是我关于 LeetCode 上的第 28 道题来具体实现 KMP 算法代码
public int strStr(String haystack, String needle) {
if(needle == null || needle.length() == 0) {
return 0;
}
int[] next = new int[needle.length()];
// 得到 next 数组
getNextArr(next, needle);
// 使用双指针进行匹配
int i = 0, j = 0;
while(i < haystack.length() && j < needle.length()) {
if(j == -1 || haystack.charAt(i) == needle.charAt(j)) {
i++;
j++;
}else {
j = next[j];
}
}
return j == needle.length() ? i - j : -1;
}
private void getNextArr(int[] next, String needle) {
int k = -1;
int j = 0;
next[0] = -1;
while(j < needle.length() - 1) {
if(k == -1 || needle.charAt(j) == needle.charAt(k)) {
k++;
j++;
next[j] = k;
}else {
k = next[k];
}
}
}