采用递归的思路。从前向后依次匹配:
遇到相同字符,都向后移动一个字符;
如果通配符遇到"?",则不需匹配,自动跳过一个字符;
如果通配符遇到"*",则可以匹配任意多个字符,包括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; }