昨天又休息了,今天赶赶进度吧…
字符串part02
28 实现strStr
题目
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
思路
一般KMP算法求next数组时都进行了减1的操作,这样子使得不匹配时,对j的处理变成了j=next[j],但这样感觉不好理解,所以我的实现并没有对next数组进行减1的操作:
具体KMP算法的讲解好复杂,代码随想录中讲的很透彻,直接看链接:代码随想录-KMP算法
代码
void getNext(int next[], string needle){
int j=0;
next[0]=0;
for(int i=1; i<needle.length(); i++){
while(j>0&&needle[i]!=needle[j]){
j=next[j-1];
}
if(needle[i]==needle[j]){
j++;
}
next[i]=j;
}
}
int strStr(string haystack, string needle) {
int *next=(int *)malloc(needle.length()*sizeof(int));
getNext(next, needle);
int j=0;
for(int i=0; i<haystack.length(); i++){
while(j>0&&haystack[i]!=needle[j]){
j=next[j-1];
}
if(haystack[i]==needle[j]){
j++;
}
if(j==needle.length()){
return i-needle.length()+1;
}
}
return -1;
}
459 重复的子字符串
题目
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
思路
原则:最长相等前后缀的规则,当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。
则“字符串s由重复子串构成”的充分必要条件是“字符串s的最长相等前后缀的长度不为0,且字符串s的长度减去该最长相等前后缀的长度后,所得的值能整除s.length()”。
代码
void getNext(int next[], string s){
int j=0;
next[0]=0;
for(int i=1; i<s.length(); i++){
//前后缀不同
while(j>0&&s[i]!=s[j]){
j=next[j-1];
}
//前后缀相同
if(s[i]==s[j]){
j++;
}
next[i]=j;
}
}
bool repeatedSubstringPattern(string s) {
//使用KMP算法的next数组来做
int next[s.length()]; //力扣中用变量做数组大小,数组不能被初始化,但是能被定义
getNext(next, s);
if(next[s.length()-1]!=0&&s.length()%(s.length()-next[s.length()-1])==0){
return true;
}
return false;
}