第一题kmp算法,
之前看了一个视频学了下,现在大概能完全a出来了,需要注意的一点:比较的时候i是从0开始的不是像计算next数组从1开始找公共前后缀,还有最后输出的结果是i-len+1 因为i是从0开始的len的话是1开始算起
class Solution {
public:
void getnext(int *next, string &s){
int j = 0;
next[0] = 0;
for(int i = 1 ;i < s.size();i++){
while(j > 0 && s[i] != s[j]){
j = next[j - 1];
}
if(s[i] == s[j]){
j++;
}
next[i] = j;
}
}
int strStr(string haystack, string needle) {
int len = needle.size();
int next[len];
int j = 0;
getnext(next,needle);
for(int i = 0;i <haystack.size();i++){
while(j > 0 && haystack[i] != needle[j]){
j = next[j-1];
}
if(haystack[i] == needle[j]){
j++;
}
if(j == len){
return i - len + 1;
}
}
return -1;
}
};
第二题重复字符串
判断的时候记得用erase去掉头尾,去尾部的时候记得注意end()-1,因为end返回的是最后一个的下一个位置。
class Solution {
public:
bool repeatedSubstringPattern(string s) {
string t = s + s ;
t.erase(t.begin());
t.erase(t.end() - 1);
auto it = t.find(s);
if(it != string::npos){return true;}
return false;
}
};