考研系列之数据结构——串的模式匹配算法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char* SString;
//暴力比对
//S  abcabaaabaabcac
//T  abaabcac
//为什么从1位置开始比较,因为0号位置存储了字符串的长度
int Index(SString S,SString T)
{
	int i=1,j=1;
	while(i<=S[0]&&j<=T[0])
	{
		if(S[i]==T[j])
		{
			++i,++j;//继续比较后续字符
		}else{
			i=i-j+2;j=1;//指针后退重新开始匹配
		}
	}
	if(j>T[0]) return i-T[0];//匹配成功
	else return 0;
}
//i游标,遍历T,现在直播不懂那么别去调试get_next代码
void get_next(char T[],int next[])
{
	int i=1;
	next[1]=0;//恒为零
	int j=0;
	//abaabcac
	while(i<T[0])//T[0]中记录了字符串的长度
	{
		if(j==0||T[i]==T[j])//j==0,说明再次回到了开头
		{
			++i;++j;
			next[i]=j;//记录出现重复的位置
		}else{
			j=next[j];//不相同,找个位置重新比较
		}
	}
}
//S  abcabaaabaabcac
//T  abaabcac
int KMP(char S[],char T[],int next[],int pos)
{
	int i=pos;//开始查找的起始位置
	int j=1;
	while(i<=S[0]&&j<=T[0])
	{
		if(j==0||S[i]==T[j]){//相等各自加加,往后走
			++i;
			++j;
		}
		else//不等,就回退next[j]的位置
			j=next[j];
	}
	if(j>T[0])//说明比对成功
		return i-T[0];
	else
		return 0;
}
//《王道C督学营》课程
//简单模式匹配 与  KMP(KMP考的概率极低)
int main()
{
	//字符串进行初始化
	char S[256];
	char T[10];
	int next[10];
	int pos;
	S[0]=strlen("abcabaaabaabcac");//strlen里有多少个字符
	strcpy(S+1,"abcabaaabaabcac");
	T[0]=strlen("abaabcac");
	strcpy(T+1,"abaabcac");
	pos=Index(S,T);//暴力匹配
	if(pos)
	{
		printf("匹配成功,位置为%d\n",pos);
	}else{
		printf("未匹配\n");
	}
	get_next(T,next);//算出next数组
	pos=KMP(S,T,next,1);
	if(pos)
	{
		printf("匹配成功,位置为%d\n",pos);
	}else{
		printf("未匹配\n");
	}
	system("pause");
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值