串的最基本匹配算法(BP)
#include<stdio.h>
#include<string.h>
#define size1 100
#define size2 50
int main()
{
char a[size1];
char b[size2];
printf("请输入主串\n");
gets(a);
printf("请输入子串\n");
gets(b);
int n=strlen(a);
int m=strlen(b);
int j,k;
int i,q=0;
for(i=0;i<=n-m;i++)
{
k=i;
j=0;
while(b[j]==a[k])
{
j++;
k++;
if(j==m)
{
printf("已经找到符合的第%d个子串,位置为%d\n",++q,i+1);
}
}
}
if(q==0)
{
printf("没有找到相关的子串");
}
return 0;
}
串的匹配算法(KBP,三种)
#include<stdio.h>
#include<string.h>
#define size1 100
#define size2 50
void get_next(char *T, int *next,int m) //改进next算法 T为子串,next为数组,m为串的长度
{
int k = -1;
int j = 0;
next[j] = k;
while (j < m)
{
if ( (k == -1) || (T[j] == T[k]) ) //注意等号是==,而不是=
{
++k; // 注意是先加后使用
++j;
next[j] = k;
}
else
{
k = next[k];
}
}
}
void get_next1(char *T, int *next,int q)//普通next算法 T为子串,next为数组,q为串的长度
{
int k = -1;
int j = 0;
next[j] = k;
next[j++]=k++;
int n=1,m=0;
for(j=2;j<q;j++)
{
while(n!=j-1)
{
if(T[n]==T[m])
{
n++;
m++;
}
else
{
n++;
m=0;
}
}
next[j]=m;
}
}
void get_next2(char *T, int *nextval,int m)//优化kmp算法nextval T为子串,next为数组,q为串的长度
{
int i=0;
int j=-1;
nextval[0]=-1;
while(i<m)
{
if(j==-1||T[i]==T[j])
{
i++;
j++;
if(T[i]==T[j])
{
nextval[i]=nextval[j];
}
else
{
nextval[i]=j;
}
}
else
{
j=nextval[j];
}
}
}
int main()
{
char a[size1];
char b[size2];
printf("请输入主串\n");
gets(a);
printf("请输入子串\n");
gets(b);
int n=strlen(a);
int m=strlen(b);
int next[size2];
//get_next(b,next,m);
//get_next1(b,next,m);
get_next2(b,next,m);
int i=0,j=0,k=1;//k为第k个符合要求的
while ( i < n && j < m )
{
if ( (j==-1)||a[i] == b[j])
{
i++;
j++;
}
else
{
j = next[j];
}
if (m == j)
{
printf("第%d个符合的位置%d\n",k++,i-m+1);
j=0;
}
}
if(i==m)
{
printf("没有找到");
}
return 0;
}