法一 暴力匹配
class Solution {
public:
int strStr(string haystack, string needle) {
int i,j,k;
for(i = 0; i < haystack.size(); i++){
k = i;
j = 0;
while(j < needle.size() && haystack[k] == needle[j]){
k++; j++;
}
if(needle[j]=='\0')
return i;
}
return -1;
}
};
法二 KMP
class Solution {
public:
vector<int> getNext(string s){
vector<int> next(s.size());
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;
}
return next;
}
int strStr(string haystack, string needle) {
if(needle.size()==0)
return 0;
vector<int> next = getNext(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-needle.size()+1);
}
return -1;
}
};
法一 暴力匹配
版本一 移动匹配
class Solution {
public:
bool repeatedSubstringPattern(string s) {
string t = s + s;
t.erase(t.begin()); t.erase(t.end() - 1); // 掐头去尾
if (t.find(s) != string::npos) return true; // r
return false;
}
};
版本二 暴力双循环(会超时)
class Solution {
public:
bool repeatedSubstringPattern(string s) {
for(int i = 0; i < s.size(); i++){
string t = s.substr(0,i+1);
string k = t;
for(int j = 0;j < s.size(); j++){
k += t;
if(k == s){
return true;
}
}
}
return false;
}
};
法二 KMP
class Solution {
public:
vector<int> getNext(string s){
vector<int> next(s.size());
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;
}
return next;
}
bool repeatedSubstringPattern(string s) {
if (s.size() == 0) {
return false;
}
vector<int> next=getNext(s);
int len = s.size();
if (next[len - 1]&& len % (len - next[len - 1]) == 0) {
return true;
}
return false;
}
};