KMP算法

来源:互联网 发布:ubuntu怎么进其他磁盘 编辑:程序博客网 时间:2024/06/07 18:44
#include <stdio.h>#include <string.h>void Next(char *str,int *next);int FindStr(char *bigStr,char *smallStr, int *next);void main(){char bigStr[30],smallStr[8];int next[4]; //next的长度应该为smallStr的一半int n;gets(bigStr);gets(smallStr);Next(smallStr, next);n = FindStr(bigStr,smallStr,next);printf("%d\n",n);}void Next(char *str,int *next){int i=0,j=0;int len;len = strlen(str);next[0] = 0;for ( ; i < len; ){if( j==0 || *(str+i)==*(str+j) ){i++;j++;next[i] = j;}else{j = next[j];}}}int FindStr( char *bigStr, char *smallStr, int *next){int i,j;int lenBig,lenSmall;lenBig = strlen(bigStr);lenSmall = strlen(smallStr);for ( i=0,j=0; i<lenBig&&j<lenSmall;  ){if (j==-1 || *(bigStr+i)==*(smallStr+j))//j-1写在前面,如果写在后面,*(smallStr+j)就越界了{i++;j++;}else{j = next[j]-1;//Next所求的是每个数的位置,而不是下标}}if( j == lenSmall ){return i-j+1;}elsereturn 0;}

 
原创粉丝点击