代码随想录:https://programmercarl.com/0028.%E5%AE%9E%E7%8E%B0strStr.html
i表示:下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。
class Solution {
public int strStr(String haystack, String needle) {
// if(needle.length()==0){
// return -1;//return 0;//空字符和谁都可以匹配
// }
int[] next =new int[needle.length()];
getNext(next,needle);
int j=0;
for(int i=0;i<haystack.length();i++){
while(j>0&&needle.charAt(j)!=haystack.charAt(i)){//while 与 if的位置不能互换!!!!进行回退之后还要继续看看这个子串有没有相同字符!!!!!!!11
j=next[j-1];
}
if(needle.charAt(j)==haystack.charAt(i)){
j++;
}
if(j==needle.length()){
return i+1-j;
}
}
return -1;
}
public void getNext(int[] next,String s){
//初始化 i后缀末尾位置 j前缀末尾位置
//前后缀相同
//前后缀不相同
//更新next数组
int j=0;
next[0]=0;
for(int i=1;i<s.length();i++){
while(j>0&&s.charAt(j)!=s.charAt(i)){//while 与 if的位置不能互换!!!!进行回退之后还要继续看看这个子串有没有相同字符!!!!!!!11
j=next[j-1];
}
if(s.charAt(j)==s.charAt(i)){
j++;
}
next[i]=j;
}
}
}