思路1:
1 暴力解决,即遍历母串,和子串,字符相等就向下走。否则母串下移一个位置重新开始和子串比较。直到相等。或者为空
代码;
char *strStr(char *haystack, char *needle) {
int len1=strlen(haystack);
int len2=strlen(needle);
int diff=len1-len2+1;
for(int i=0;i<diff;i++){
int j=0;
for(;j<len2;j++){
if(haystack[i+j]!=needle[j])
break;
}
if(j==len2)
return haystack+i;
}
return NULL;
}
思路2 :KMP 算法
这是我看过一个讲KMP很清晰的博客 http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
代码:
char *strStr(char *haystack, char *needle) {
char* result=NULL;
vector<int> next=getNext(needle);
int len1=strlen(haystack);
int len2=strlen(needle);
int q=0;
for(int i=0;i<len1;i++){
while(q>0&&haystack[i]!=needle[q])
q=next[q-1];
if(haystack[i]==needle[q])
q++;
if(q==len2){
result=haystack+(i-len2);
break;
}
}
return result;
}
vector<int> getNext(char* p){
int len=strlen(p);
int k=0; //代表最大公共子串
vector<int> next(len,0);
for(int i=1;i<len;i++){
while(k>0&&p[i]!=p[k])
k=next[k-1];
if(p[i]==p[k])
k++;
next[i]=k;
}
return next;
}