classSolution {
public:int strStr(string haystack, string needle) {
returnbruth(haystack, needle);
}
private:int bruth(string text, string pattern) {
int M = pattern.length();
int N = text.length();
if (M ==0) return0;
if (N ==0) return-1;
for (int i =0; i <= N - M; ++i) {
int j =0;
for (; j < M; ++j) {
if (text.at(i + j) != pattern.at(j))
break;
}
if (j == M) return i;
}
return-1;
}
}
classSolution {
public:int strStr(string haystack, string needle) {
returnbruth(haystack, needle);
}
private:int bruth(string text, string pattern) {
int M = pattern.length();
int N = text.length();
if (M ==0) return0;
if (N ==0) return-1;
int i =0;
int j =0;
for (; i < N && j < M; ++i) {
if (text.at(i) == pattern.at(j)) j++;
else { i -= j; j =0; }
}
if (j == M) return i - M;
elsereturn-1;
}
}
classSolution {
public:int strStr(string haystack, string needle) {
returnkmp(haystack, needle);
}
private:// KMP
int kmp(string text, string pattern) {
int M = pattern.length();
int N = text.length();
if (M ==0) return0;
if (N ==0) return-1;
int i =0;
int j =0;
int* next =newint[M];
calculateNext(pattern, next);
for (; i < N && j < M; ++i) {
if ( j ==-1|| text.at(i) == pattern.at(j) ) j++;
else { i--; j = next[j]; } // i维持不变,j跳转位置由next数组决定
}
delete[] next;
if (j == M) return i - M;
elsereturn-1;
}
voidcalculateNext(string pattern, int* next) {
if (pattern.length() ==0|| next ==nullptr) return;
next[0] =-1;
int i =0;
int k =-1;
while (i < pattern.length() -1) {
if (k ==-1|| pattern.at(k) == pattern.at(i)) {
++i;
++k;
next[i] = k;
}
else {
k = next[k];
}
}
}
}