字符串的模式匹配是非常重要的应用,下面是最简单的模式匹配代码:
//顺序串的简单模式匹配 #include <stdio.h> #include <stdlib.h> #include <string.h> #define Max 100 bool trag; char *Is_exist(char *s,int poi,char *t) { int n=strlen(s),m=strlen(t); if(poi<0 || poi>=n){ printf("wrong\n"); return NULL; } int i=poi,j=0; while(poi<=n-m && j<m){ if(s[i]==t[j]){ i++; j++; } else{ poi++; i=poi; j=0; } } if(j==m){ trag=true; return s+poi; } else { trag=false; return NULL; } } int mian() { char s[Max],t[Max]; while(scanf("%s%s",s,t)!=EOF) { if(trag) printf("%s\n",Is_exist(s,0,t)); } return 0; }
//另一种写法——利用字符串处理库函数 char *Is_exist(char *s,int poi,char *t) { int n=strlen(s),m=strlen(t); if(poi<0 || poi>=n){ printf("wrong\n"); trag=false; return NULL; } char *temp=new char[m+1]; while(poi<=n-m){ strncpy(temp,s+poi,m); temp[m]='\0'; if(strcmp(temp,t)==0){ trag=true; delete []temp; return s+poi; } poi++: } delete []temp; trag=false; return NULL; }
这种算法的效率是非常低的,为O(m*n),针对效率低,因此产生了效率更高的kmp算法。这种算法比较难理解,下面只是给出核心代码:
int get_next() { int i=0,j=-1; next[0]=-1; while(str[i]){ if(j==-1 || str[i]==str[j]){ i++; j++; next[i]=j; } else j=next[j]; } return 0; } int find_ans(){ int ans=0; int i=0,j=0; while(rec[i]){ if(rec[i]==str[j]){ if(j==n-1) ans++,j=0,i++; else j++,i++; } else j=next[j]; if(j==-1) j=0,i++; } return ans; }
kmp算法主要是next的应用,要细细体会。