思路:KMP经典算法,具体解释可以参照July的关于KMP的博文。
code:
class Solution {
public:
void GetNext(char * needle, vector<int> &next){
int n = strlen(needle);
next[0] = -1;
int k = -1;
int j = 0;
while(j < n-1){
if(k == -1 || needle[j] == needle[k]){
k++;
j++;
if(needle[j] != needle[k])
next[j] = k;
else
next[j] = next[k];
}
else
k = next[k];
}
}
char *strStr(char *haystack, char *needle) {
int n = strlen(haystack), m = strlen(needle);
if(n==0){
if(m == 0)
return haystack;
return NULL;
}
if(m == 0) return haystack;
vector<int> next(m,0);
GetNext(needle,next);
int i = 0, j =0;
while(i < n && j < m){
char *p = haystack + i, *q = needle + j;
if(j == -1 || *p == *q){
i++;
j++;
}
else
j = next[j];
}
if(j >= m)
return haystack+i-j;
else
return NULL;
}
};