这几天学习了神奇的字符串匹配算法,
在没学之前,按照自己的想法写出了BF算法:
#include <stdio.h> #include <string.h> char ch[1001],p[12]; int lenth_ch,lenth_p; int BF() { int i=0,j=0,counter=0; while(i<lenth_ch) { while(i<lenth_ch&&j<lenth_p) { if(ch[i]==p[j]) { i++;j++; } else { i=i-j+1;j=0;} } if(j==lenth_p) counter++; i=i-j+1;j=0;g } return counter; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",p); scanf("%s",ch); lenth_p=strlen(p); lenth_ch=strlen(ch); printf("%d\n",BF()); } return 0; }
学了数据结构之后:
#include <stdio.h> #include <string.h> #define M 200 // 模式串 自己和自己进行匹配 void getnext(char t[],int length,int *next) { int i=0,j=-1; next[0]=-1; while(i<length-1) { if(j==-1||t[i]==t[j]) { i++; j++; if(t[i] != t[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; //失配时,模式串向右移动 } } int KMP(char *s,char *t,int pos) { int i=pos,j=0,next[M]; getnext(t,strlen(t),next); while(i<(int)strlen(s) && j<(int)strlen(t)) { if(j==-1||s[i]==t[j]) { i++; j++; } else { j=next[j]; } } if(j==(int)strlen(t)) return i-j;//返回开始匹配到的主串位置 else return -1; } int main() { char a[M],b[M]; while(~scanf("%s%s",a,b)) { if(KMP(a,b,0)!==-1) printf("found\n"); else printf("not found\n"); return 0; }
BF算法和 KMP 算法
最新推荐文章于 2024-09-22 21:59:13 发布