华为编程大赛-字符串匹配

判断包含通配符的匹配字符串是否完全匹配输入的字符串,匹配字符串中包含的通配符仅有‘*’和‘?’,且通配符不会连续出现 。(要求完全匹配,而不是包含)

 

其中,通配符‘*’:代替0个或多个字符,通配符‘?’:代替一个字符

 

l  要求实现函数

 

int GetMatchSta (const char *ArrStr, const char *KeyStr)

 

【输入】 ArrStr:    给定的字符串

 

         KeyStr:      包含通配符的匹配字符串

 

【输出】无

 

【返回】是否匹配,匹配返回1,不匹配返回0

 

l  示例

 

输入:” abcdefg”, “a*'”

 

返回:1

 

 

 

输入:“tommababcabc” , t?m*ab*abc

 

返回:1



实现想法,很自然的自动机分析,直接匹配。


#include <stdio.h>
int GetMatchSta(const char *ArrStr, const char *KeyStr)
{
	int starnext = 0;
	int keyidx = 0;
	int stridx = 0;
	int match = 0;
	while (1)
	{
		if (ArrStr[stridx] == '\0' )
		{
			if (KeyStr[keyidx] ==  '\0')
				match = 1;
			break;
		}
		if (KeyStr[keyidx] == '?')
		{
			keyidx++;
			stridx++;
		}
		else if (KeyStr[keyidx] == '*')
		{
			starnext = keyidx+1;
			keyidx++;
		}
		else
		{
			if (KeyStr[keyidx] != ArrStr[stridx] && starnext != 0)
			{
				keyidx = starnext;
				if (KeyStr[keyidx] != ArrStr[stridx])
					stridx++;
			}
			else if (KeyStr[keyidx] != ArrStr[stridx] && starnext == 0)
			{
				break;
			}
			else
			{
				keyidx++;
				stridx++;
			}
		}
	}//end while
	return match;
}
int main()
{
	char *str1="abcdefg";
	char *kstr1 = "a*";
	char *str2 = "tommababcabc";
	char *kstr2 = "t?m*ab*abc";
	char *str3 = "011099";
	char *kstr3 = "0*1*9?";
	printf("%d\n",GetMatchSta(str1, kstr1));
	printf("%d\n",GetMatchSta(str2, kstr2));
	printf("%d\n",GetMatchSta(str3, kstr3));
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值