一、暴力破解
class Solution {
public:
int strStr(string haystack, string needle) {
// 暴力破解
if(haystack.length() < needle.length()) return -1;
for(int i = 0; i <= haystack.length() - needle.length(); i++){
int j = 0;
for(j; j < needle.length(); j++){
if(haystack[i + j] != needle[j])
break;
}
if(j >= needle.length())
return i;
}
return -1;
}
};
二、KMP算法
class Solution {
public:
void getNext(int *next, string needle){
int j = -1;
next[0] = j;
int i = 1;
for(i = 1; i < needle.length(); i++){
while(j >= 0 && needle[i] != needle[j + 1]){
j = next[j];
}
if(needle[i] == needle[j + 1]){
j++;
}
next[i] = j;
}
}
int strStr(string haystack, string needle) {
// KMP
if(needle.length() == 0) return 0;
int next[needle.length()];
getNext(next, needle);
int j = -1;
for(int i = 0; i < haystack.length(); i++){
while(j >= 0 && haystack[i] != needle[j + 1]){
j = next[j];
}
if(haystack[i] == needle[j + 1]){
j++;
}
if (j == (needle.length() - 1)) {
return i - needle.length() + 1;
}
}
return -1;
}
};