本来不想自己写的,但网上的大都是c++实现的,有些自称是C实现的 复制到编译器上根本运行不了。
KMP还是很经典的算法,我就不加注释了,直接返回第几个数匹配..
#include <stdio.h>
#include <stdlib.h>
void getNext(char t[]);
int next[80];
int main()
{
char s[80],t[80];
int result=0;
printf("输入字符串:");
gets(s);
printf("输入字符串:");
gets(t);
getNext(t);
int i=0,j=0;
while(i<strlen(s)&&j<strlen(t))
{
if(s[i]==t[j]) {i++;j++;}
else
{
j=next[j];
if(j==-1) {i++;j++;}
}
}
if(j>=strlen(t)) result=i-j+1;
else result=0;
printf("%d/n",result);
}
getNext(char t[])
{
next[0]=-1;
int j=0,k=-1;
while(j<strlen(t))
{
if(k==-1||t[j]==t[k])
{
j++;
k++;
next[j]=k;
}
else k=next[k];
}
}
}
BM算法,网上实现的不多,有几个版本的都是很复杂,指针来指针去,其实没那么烦
#include <stdio.h>
#include <stdlib.h>
int BM(char s[],char t[],int n,int m);
int dist(char s,char t[]);
int main()
{
char s[80],t[80];
printf("输入字符串:");
gets(s);
printf("输入字符串:");
gets(t);
// printf("%s/n %s",s1,s2);
printf("%d",BM(s,t,strlen(s),strlen(t)));
}
int BM(char s[],char t[],int n,int m)
{
int i=m-1,j;
while(i<n)
{
j=m-1;
while(j>-1&&s[i]==t[j])
{
j--;
i--;
}
if(j==-1) return i+2;
else i=i+dist(s[i],t);
}
return 0;
}
int dist(char s,char t[])
{
int m=strlen(t);
int j=m-1;
for(j=m-1;j>-1;j--)
{
if(t[j]==s) break;
}
if(j==m-1||j==-1) return m;
else return m-j-1;
return 0;
}
BM(Boyer-Moore)算法是目前相当有效又容易理解的一种,一般情况下,比KMP算法快3-5倍。 BM算法采用从右向左比较 的方法,同时应用到了两种启发式规则,即坏字符规则 和好后缀规则 ,来决定向右跳跃的距离。
大家看着玩,多批评啊 呵呵