题目是来自华为编程大赛
问题描述
判断包含通配符的匹配字符串是否完全匹配输入的字符串, 匹配字符串中包含的 通配符仅有‘*’和‘?’ ,且通配符不会连续出现 。 (要求完全匹配,而不是包 含)
其中,通配符‘*’ :代替 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;
}
大家帮我看看,有问题没有。
谢谢哦。