Day8:字符串(kmp算法)
找出字符串中第一个匹配项的下标(力扣28)
Kmp算法核心在于前缀表(挖个坑明天填)
class Solution {
public int strStr(String haystack, String needle) {
char[] cr = needle.toCharArray();
char[] mr = haystack.toCharArray();
int n = needle.length();
int[] next = new int[n];
next[0] = 0;
for(int i = 0, j = 1; j < n; j++){
//前后缀不同
while(i > 0 && cr[i] != cr[j]) i = next[i-1];
//前后缀相同
if(cr[i] == cr[j]) i++;
//更新next
next[j] = i;
}
for(int i = 0, j = 0; i < haystack.length(); i++){
while(j > 0&&mr[i] != cr[j]) j = next[j-1];
if(mr[i] == cr[j]) j++;
if(j == n) return i - n + 1;
}
return -1;
}
}
重复子字符串(力扣459)
class Solution {
public boolean repeatedSubstringPattern(String s) {
char[] cr = s.toCharArray();
int n = cr.length;
int[] next = new int[n];
next[0] = 0;
for(int i = 0, j = 1; j < n; j++){
while(i > 0&&cr[i] != cr[j]) i = next[i-1];
if(cr[i] == cr[j]) i++;
next[j] = i;
}
if (next[n-1] > 0 && n % (n - next[n - 1]) == 0) {
return true;
}
return false;
}
}