BF算法
BF算法也称朴素算法,思想简单,但效率较低。代码如下:
#include<stdio.h>
#include<string.h>
//s是主串,p是子串,从s串的pos位置开始搜索
int BF(char* s,char* p,int pos)//时间复杂度O(n*m)(存在回退,n为s串长度,m为p串长度)
{
if(s==NULL||p==NULL)
{
return -1;
}
int lens=strlen(s);
int lenp=strlen(p);
if(lens<lenp)
{
return -1;
}
int i=pos;
int j=0;
while(i<lens&&j<lenp)
{
if(s[i]==p[j])
{
i++;
j++;
}
else //失配
{
i=i-j+1;
j=0;
}
}
if(j>=lenp)//在s串中找到了与p串相等的子串,返回其起始位置
{
return i-j;
}
return -1;//没找到
}
int main()
{
char* s="abbbacabcdabcde";
char* p="abcd";
printf("匹配的位置:%d\n",BF(s,p,3));
return 0;
}
运行结果如下:
KMP算法
在p串中,存在两个最长的相等真子串,一个以0位置开始,一个以j-1位置结束,k就是真子串的长度.
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//规定next[0]=-1;next[1]=0;
void GetNext(int* next,char* p)
{
int lenp=strlen(p);
next[0]=-1;
next[1]=0;
int m=1;
int x=0;
while(m<lenp)
{
if(x==-1||p[m]==p[x])
{
next[m+1]=x+1;
m++;
x++;
}
else
{
x=next[x];
}
}
}
int KMP(char* s,char* p,int pos)
{
if(s==NULL||p==NULL)
{
return -1;
}
int lens=strlen(s);
int lenp=strlen(p);
if(lens<lenp)
{
return -1;
}
int i=pos;
int j=0;
int* next=(int*)malloc(sizeof(int)*lenp);
if(next==NULL)return -1;//申请失败
GetNext(next,p);
for(int l=0;l<lenp;++l)
{
printf("%d ",next[l]);
}
printf("\n");
while(i<lens&&j<lenp)
{
//j==-1说明p串中第一个位置失配
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j>=lenp)
{
return i-j;
}
free(next);
return -1;
}
int main()
{
char* s="abcabcaabcdabcde";
char* p="abcde";
printf("相等的位置为:%d\n",KMP(s,p,0));
return 0;
}