一般的查找子串的方法:
int search(char src[],char pat[]){
int m=strlen(src);
int n=strlen(pat),i=0,j=0;
while(i<m&&j<n){
if(src[i]==pat[j]){
j++;
}
else{
i=i-j;
j=0;
}
i++;
}
if(j>=n)
return i-n;
else
return -1;
}
KMP算法学习:
转载:
参考 : http://blog.csdn.net/v_JULY_v/article/details/6545192
参考: http://www.cnblogs.com/c-cloud/p/3224788.html
void makeNext(char P[],int next[])
{
int q,k;
int m = len(P);
next[0] = 0;
for (q = 1,k = 0; q < m; ++q)
{
while(k > 0 && P[q] != P[k])//此处的while循环比较难理解
k = next[k-1];
if (P[q] == P[k])
{
k++;
}
next[q] = k;
}
}
int search(char src[],char pat[],int next[]){
int m=len(src);
int n=len(pat),i=0,j=0;
while(i<m&&j<n){
if(src[i]==pat[j]||j==0){//我刚开始没有待j=0的情况,产生了死循环,出现主字符串和子字符串不相等的时候死循环,不管什么时候都是同时加加,只是改变的匹配字符串的起始匹配位置
i++;
j++;
}
else
{
j=next[j];
}
}
if(j>=n)
return i-n;
else
return -1;
}
int main(){
char *str="ababxbababcadfdsss";
char *pat="abca";
int next[20]={0},index;
makeNext(pat,next);
for (int i = 0; i < len(pat); ++i)
{
printf("%d ",next[i]);
}
printf("\n");
index=search(str,pat,next);
if(index!=-1)
printf("%d",index);
else
printf("没找到");
return 0;
}
自己的理解:
KMP算法的关键是next数组的求解:
解释一下next数组的逻辑
1.直到找到匹配字符串后面第一个字符与pat[0]相等的时候,next【i】的值才加1,否则都是0;
2.while循环:前提是已经找到的前提下,就利用之前的next值
递归实现字符串的逆序输出:
void change(char *str){
if(*str=='\0')
return ;
change(str+1);
putchar(*str);
}
int main(){
char *pat="abca";
change(pat);
putchar('\n');
return 0;
}
先递推在回归: