字符串的模式匹配是非常重要的应用,下面是最简单的模式匹配代码:
//顺序串的简单模式匹配
#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的应用,要细细体会。