欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

KMP字符串匹配

程序员文章站 2024-01-16 22:51:52
...

源代码:

#include<stdio.h>

typedef struct
{
	char ch;
	int len;
}string;

int next[100];
int local[100];
int address;

//构造字符串 
void CreateString(string s[])
{
	int i=0;
	char c;
	c=getchar();
	while(c!='\n')
		{
			s[++i].ch=c;
			c=getchar();
		}
	s[0].len=i;
}
//遍历串 
int getnext(string s[])
{
	next[1]=0;
	int i=1,j=0;
	while(i<s[0].len)
	{
		if(j==0||s[i].ch==s[j].ch)
		{
			i++;
			j++;
			next[i]=j;
		}
		else
		j=next[j];
	}
}

//KMP串匹配算法 
int kmp(string s[],string t[],int pos)
{
	int i=pos,j=1;
	while(i<=s[0].len&&j<=t[0].len)
	{
		if(j==0||s[i].ch==t[j].ch)
		{
			i++;
			j++;
		}
			else
     	j=next[j];
	}
	address=i-pos+1;
	if(j>t[0].len)
	{
		return i-t[0].len;
	}
	return 0;
}

//主函数 
int main(){
	string s[100];
    printf("请输入主串:\n") ;
	CreateString(s);
       
//字符匹配 
	char c;
	printf("请输入一个字符:\n");
	c=getchar();
	getchar();
	int count=0,local1,local2;
	for(int i=0;i<s[0].len;i++)
	{
		if(s[i].ch==c)
		{
			printf("at %d\n",i);
			count++;
		}
	}
	printf("appear %d\n",count);
	
	
	//子串匹配 
	string s1[100];
	printf("请输入一个子串:\n");
	CreateString(s1);
	getnext(s1);
	int pp=1;
	count=0;
	while(pp<s[0].len)
	{
		local1=kmp(s,s1,pp);
		if(local1)
		{
			
			count++;
			printf("at %d\n",local1);
		}
		pp+=address;
	}
	if(count)
	printf("appear %d\n",count);
	else
	printf("not find\n");
   
    //单词匹配 
	string s2[100];
    printf("请输入一个单词:\n");
    CreateString(s2);
	getnext(s2);
	pp=1;//串首 
	count=0;
	while(pp<s[0].len)
	{
		local2=kmp(s,s2,pp);
		if(local2)
		{
			//是否为单词的判定,首尾为空格 
			if((local2==1&&local2+s2[0].len==' ')||(local2+s2[0].len-1==s[0].len&&s[local2-1].ch==' ')||(s[local2-1].ch==' '&&s[local2+s2[0].len].ch==' '))
			{
			count++;
			printf("at %d\n",local2);
		}
		}
		pp+=address;
	}
	if(count)
	printf("appear %d\n",count);
	else
	printf("not find\n");
	 return 0; 
}
	


运行结果:

KMP字符串匹配

注意:主串可以任意,单词为首尾都是空格的字符串(当位于开头时,只需尾部为空格;当位于结尾时,只需开头为空格)


相关标签: C 数据结构