采用递归的思路。从前向后依次匹配:
遇到相同字符,都向后移动一个字符;
如果通配符遇到"?",则不需匹配,自动跳过一个字符;
如果通配符遇到"*",则可以匹配任意多个字符,包括0个,此时可以有三种选择:
1.匹配0个,通配符向后移动一个字符,字符串不动;
2.匹配1个,通配符和字符串都向后移动一个字符;
3.匹配多个,通配符不动,字符串向后移动一个字符。
递归的终止条件:通配符或者字符串遇到'\0'。表示同时结束,返回true。
#include <iostream>
#include <string>
using namespace std;
bool match(const char* str,const char* str1)
{
//两种特殊情况下的结束
//两个字符串同时结束,返回true
if((*str=='\0') && (*str1=='\0'))
return true;
//两个字符串中有一个先结束,返回false
if((*str=='\0') || (*str1=='\0'))
return false;
if(*str=='?')
{
//遇到到 ? 则算匹配到一个字符,跳过一个位置
return match(str+1,str1+1);
}
else if(*str=='*')
{
//遇到*号,匹配0个(str+1,str1不用动),匹配1个(str和str1都往前移动1位),匹配多个(str不用动,str+1)
//return match(str+1,str1) || match(str+1,str1+1) || match(str,str1+1);
return match(str+1,str1) || match(str+1,str1+1) || match(str, str1+1);
}
else if(*str==*str1)
{
//当前两字符相等,则进行下一个字符的匹配
return match(str+1,str1+1);
}
return false;
}
int main()
{
string str,str1;
while(cin>>str>>str1)
{
bool ret;
ret=match(str.c_str(),str1.c_str());
if(ret)
cout<<"true"<<endl;
else
cout<<"false"<<endl;
}
return 0;
}
京公网安备 11010502036488号