28. 实现 strStr()
第一次听KMP算法,看了一下视频看懂了,尝试自己先写一下看看
class Solution {
public:
void getNext(int* next, const string& s) {
//int i=1;// 后缀末尾
int j=0;//前缀末尾
// 后缀不断后移,前缀反复匹配
for(int i=1;i<s.size()-1;i++){
while(j>0 && s[i]!=s[j]){
j=next[j-1]; // 反复回退,直到直到前面第最短个匹配上的,如下示意
// _ _ + (回退位置)...... _ _ -(第j个位置,不等则向前回退)....._ _+(第i个位置)
}
// 匹配上了
if(s[i]==s[j]){
j++;
}
next[i]=j;
}
}
int strStr(string haystack, string needle) {
// 这个是注意点
if (needle.size() == 0) {
return 0;
}
int* Next=new int[needle.size()]{0};
getNext(Next,needle);
int j=0;
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==needle.size()){
return (i-j+1);
}
}
return -1;
}
};
459.重复的子字符串
1)题目意思能理解,暴力试试先
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int lenHalf=s.size()/2;
for (int i=1;i<=lenHalf;i++){
int j;
for(j=i;j<s.size();j++){
if(s[j]!=s[j-i]){
break;
}
}
if(j==s.size()){
return true;
}
}
return false;
}
};
// 暴力解法
2)移动匹配
补
3)KMP解法
补