代码随想录day08|28. 找出字符串中第一个匹配项的下标
28. 找出字符串中第一个匹配项的下标
class Solution {
public int strStr(String haystack, String needle) {
if(needle.length() == 0)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)){
j = next[j-1];
}
if(needle.charAt(j) == haystack.charAt(i))j++;
if(j == needle.length())return i - needle.length()+1;
}
return -1;
}
private void getNext(int[] next,String s){
int j = 0;
next[0] = 0;
for(int i = 1 ; i < next.length ; i++){
//【j】不等于【i】,j就回退
while(j > 0 && s.charAt(j) != s.charAt(i))j = next[j-1];
//如果【j】等于【i】,j就加一
if(s.charAt(j) == s.charAt(i))j++;
//将j赋值给【i】
next[i] = j;
}
}
}
思路:
kmp算法:
一.建立next数组保存匹配串(短的那一个)中最大相同前后缀
二.类似暴力算法的搜索,但搜索到不同点时,查找next数组中的值,从改下标继续遍历,遍历完成就返回改下标-匹配数组长度-1;
https://www.zhihu.com/question/21923021/answer/281346746