实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
本方法使用了kmp算法,时间快过leetcode上的答案,参考了知乎大佬的文章如何好地理解和掌握 KMP 算法?
class Solution {
/**
* @param haystack 原串
* @param needle 匹配串
* @return
*/
public int strStr(String haystack, String needle) {
if (needle.isEmpty()){
return 0;
}
int n = haystack.length();
int m = needle.length();
char[] hay = haystack.toCharArray();
char[] nee = needle.toCharArray();
int next[] = new int[m+1];
//算出next数组
next[0] = -1;
int i = 0,j = -1;
while (i<m){
if (j==-1 || nee[i]==nee[j]){
++i;
++j;
next[i] = j;
}
else {
j = next[j];
}
}
//**************
//根据next数组进行kmp算法
int x = 0,y=0;
while (x<n && y<m){
if (y==-1 || hay[x]==nee[y]){
x++;
y++;
}
else {
y = next[y];
}
}
//**************
if (y==nee.length){
return x-y;
}else {
return -1;
}
}
}