数据结构 模式匹配BF和KMP算法实现

BF 算法:

#include<stdio.h>
#include<string.h> 
#include<stdlib.h> 
#define MaxSize 100 //串的最大长度 
//串的定长顺序储存结构 
typedef struct//
{  
    char str[MaxSize];//储存串的一维数组 
}SString;    
int BFIndex(SString S, int pos, SString T) 
{    
    int i = pos;   
    int j = 0; //初始化 
    while(i <=strlen(S.str)&& j<=strlen(T.str)) //两串均未达到串尾 
    {   
	    if(S.str[i-1] == T.str[j])//继续比较后续字符 
	    {
	           i++;   
			   j++;   
		}   
		else   //指针后退重新开始匹配 
		{   
		   i = i-j+1;    
		   j = 0;  
		}  
	}   
	if (j==strlen(T.str))//匹配成功 
   {      
       return (i-strlen(T.str));   
   }  
    else    //匹配失败 
	return 0;
}

int main() 
{  
     SString S,T;  
     int pos,ans;  
     printf("请输入主串S的字符:");  
     scanf("%s",S.str);      
     printf("请输入子串T的字符:");  
     scanf("%s",T.str);  
     printf("请输入pos的值:");  
     scanf("%d",&pos);      
     ans=BFIndex(S,pos,T);//调用BFIndex函数 
     printf("子串T在主串S中第pos个字符之后的位置为:"); 
     printf("%d\n",ans);    
     system("pause");  
     return 0;
}

KMP算法

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define MAXLEN 100//串的最大长度 
typedef struct
{
	char ch[MAXLEN+1];
}SString;
void get_next(SString T,int next[])//求模式串next函数值 并存入数组next 
{
	int i,j;
	i=1;
	next[1]=0;
	j=0;
	while(i<strlen(T.ch))
	{
		if(j==0||T.ch[i]==T.ch[j])
		{
			++i;
			++j;
			next[i]=j;
		}
		else
			j=next[j];
	}
}
int Index_KMP(SString S,SString T,int pos,int next[])
//利用模式串T的next函数求T在主串S中第pos个字符之后的位置 ,其中T非空 
{
	int i,j;
	i=pos;j=1;
	while(i<=strlen(S.ch)&&j<=strlen(S.ch))
	{
		if(j==0||S.ch[i]==T.ch[j])
		{
			++i;++j;
		}
		else
	    {
	    	j=next[j];
		}
	}
	if(j>strlen(T.ch))
		return i-strlen(T.ch);
	else
		return 0; 
}

int main()
{
	SString S,T;
	int pos,ans,next[MAXLEN];
	printf("请输入S串\n"); 
	scanf("%s",S.ch);
	printf("请输入T串\n");
	scanf("%s",T.ch);
	printf("请输入pos的值\n");
	scanf("%d",&pos);
	get_next(T,next);
	ans=Index_KMP(S,T,pos,next);
	if(ans==0)
	  printf("匹配失败\n");
	else
	{
		printf("模式T在主串S中第pos个字符开始第一次出现的位置为:%d\n",ans);
	}
}

KMP扩展:

void get_nexttval(SString T,int nextval())
{
	int i,j;
	i=1;
	nextval[1]=0;
	j=0;
	while(i<T.length)
	{
		if(j==0||T.ch[i]==T.ch[j])
		{
			++i;++j;
			if(T.ch[i]!=T.ch[j])
			  nextval[i]=j;
			else nextval[i]=nextval[j];
		}
		else
		    j=nextval[j];
	}
}


    原文作者:KMP算法
    原文地址: https://blog.csdn.net/yao1373446012/article/details/52824252
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞