|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 ~风介~ 于 2014-5-23 16:37 编辑
先贴代码,晚一点出详解~ ^_^
BF算法比较简单上一张图:
- #include<stdio.h>
- #include<string.h>
- #define MAXSTRLEN 255
- typedef unsigned char SString[MAXSTRLEN];
- int BF_Match(SString s,SString t)
- {
- int i=0,j=0;
- int n=strlen(s),m=strlen(t);
-
- while((i<n)&&(j<m))
- {
- if(s[i]==t[j]) /*匹配成功后,继续下一轮匹配,最后匹配成功后,i和j还要加一,然后跳出循环*/
- {
- i++;
- j++;
- }
- else /*匹配失败,i回溯j置零,下一趟匹配*/
- {
- i = i-j+1;
- j=0;
- }
- }
- if(j==m)/*如果匹配成功的话,返回匹配成功的第一个位置*/
- return (i-m);
- else
- return -1;
- }
- int main()
- {
- SString s,t;
- int i;
- printf("请输入主串s:");
- scanf("%s",s);
- printf("请输入模式串t:");
- scanf("%s",t);
-
- i = BF_Match(s,t);
- if(i!= -1)
- {
- printf("模式串在主串中第一次出现的下标为:%d\n",i);
- }
- else
- {
- printf("主串中不存在模式串!\n");
- }
-
- return 0;
-
- }
复制代码 BM算法
- #include<stdio.h>
- #include<string.h>
- #define MAXSTRLEN 255
- typedef unsigned char SString[MAXSTRLEN];
- int BM(SString S,SString T)
- {
- int lenS,lenT,i,j;
- lenS=strlen(S);
- lenT=strlen(T);
- for(i=0;i<=lenS-lenT;i++)/*当主串的字符小于模式串t时停止*/
- {
- if(T[0]==S[i]&&T[lenT-1]==S[i+lenT-1])/*比较第一个和最后一个字符*/
- {
- for(j=1;j<lenT-1;j++)/*比较*/
- {
- if(T[j]!=S[j+1])
- break;
- }
- if(j==lenT-1) return i+1;
- }
- }
- return 0;
- }
- int main()
- {
- int i;
- SString S,T;
- printf("请输入主串S:");
- scanf("%s",S);
- printf("请输入模式串T:");
- scanf("%s",T);
-
- i=BM(S,T);
- if(i==0)
- printf("主串中不存在模式串!\n");
- else
- printf("模式串在主串中第一次出现的下标为%d\n",i);
-
- return 0;
- }
复制代码 KMP算法
- #include<stdio.h>
- #include<string.h>
- #define MAXSTRLEN 255
- typedef unsigned char SString[MAXSTRLEN];
- void get_next(SString T, int next[])
- {
- int lenT,i=1,j=0;
- lenT=strlen(T);
- next[1]=0;
- while(i<lenT)
- {
- if(j==0 || T[i-1]==T[j-1])
- {++i; ++j; next[i]=j;}
- else
- j=next[j];
- }
- printf("模式串T的next函数值为:");
- for(i=1;i<=lenT;i++)
- printf("%d ",next[i]);
- printf("\n");
- }
- int KMP(SString S, SString T)
- {
- int next[MAXSTRLEN];
- int lenS,lenT,i=1,j=1;
- lenS=strlen(S);
- lenT=strlen(T);
- get_next(T,next);
- while(i<=lenS && j<=lenT)
- {
- if(j==0 || S[i-1]==T[j-1])
- {++i; ++j;}
- else
- j=next[j];
- }
- if(j>lenT) return i-lenT;
- else return 0;
- }
- int main()
- {
- SString S,T;
- int i;
- printf("请输入主串S:");
- scanf("%s",S);
- printf("请输入模式串T:");
- scanf("%s",T);
- i=KMP(S,T);
- if(i==0)
- printf("主串中不存在模式串!\n");
- else
- printf("模式串在主串中第一次出现的下标为%d\n",i);
-
-
- return 0;
- }
复制代码
|
|