华为编程大赛-菜鸟学算法

题目是来自华为编程大赛 

问题描述 

判断包含通配符的匹配字符串是否完全匹配输入的字符串, 匹配字符串中包含的 通配符仅有‘*’和‘?’ ,且通配符不会连续出现 。 (要求完全匹配,而不是包 含)
其中,通配符‘*’ :代替 0 个或多个字符,通配符‘’ :代替一个字符 要求实现函数 

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

【输入】 ArrStr: 给定的字符串 KeyStr: 包含通配符的匹配字符串 

【输出】无 

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

示例 输入: abcdefg”, “a*'” ” 返回:1 

输入: “tommababcabc” , tom*ab*abc 返回:1(看网上的题目是tom*ab*abc=>tm*ab*abc,打肉眼分析发现 这个明显不匹配

我的想法是:

使用两个指针,每个字符串使用一个;判断KeyStr当前字符:

如果为’* ‘,1 为最后一个字符,返回 为1 通过;

     2 不为最后一个,取出下一个字符A,ArrStr跳转到下一个为A的位置,从新匹配。如果没有找到返回 0;

如果为‘?’,都像后移。

default :比较指向的字符。

下面是我的代码:

#define AnyOne '*'
#define One '?'
#define MAXNUM 100
int GetMatchSta (const char *ArrStr, const char *KeyStr)
{
if(strlen(ArrStr)<strlen(KeyStr))  return 0;//input invalidate
char temp;
char New_ArrStr[MAXNUM],New_KeyStr[MAXNUM];
strcpy(New_ArrStr,ArrStr);
strcpy(New_KeyStr,KeyStr);
char* flg_AS=New_ArrStr;
char* flg_KS=New_KeyStr;
while(*flg_AS!=NULL&&*flg_KS!=NULL)
{
temp=*flg_KS;
switch(temp)
{
case AnyOne:
flg_KS++;
flg_AS++;
if(flg_KS!=NULL) 
return 1; // match ok beause of * 
else 
{
const char next=*flg_KS;
if((flg_AS=strstr(flg_AS,&next))==NULL)
{
return 0; //match fail 
}
}
break;
case One: //move to next positoin 
flg_KS++;
flg_AS++;
break;
default:
if(temp==*flg_AS)
{
flg_AS++;
flg_KS++;
}
else
return 0;    //match fail 
break;
}
}
return *flg_AS==NULL&&*flg_KS==NULL?1:0;
}
int main(int argc, char* argv[]) 
{
printf("%d \n",GetMatchSta("tommababcabc","tom*ab*abc"));
return 0; 
}

大家帮我看看,有问题没有。

谢谢哦。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值