/*
'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false
*/
#include <iostream>
using namespace std;
bool isMatch(const char* str, const char* pattern)
{
if (*str == '\0'){
if (*pattern == '\0'){ //如果都是空串,则认为匹配
return true;
}
else{
while (*pattern == '*') ++pattern;
return *pattern == '\0';
}
}
else if (*pattern == '\0'){ //只有pattern是空串,则不匹配
return false;
}
else{
int i = 0;
while (str[i] && pattern[i]){
if (str[i] != pattern[i]){
if (pattern[i] == '?'){ //单一通配符
++i;
continue;
}
else if (pattern[i] == '*'){ //多重通配符
pattern += i;
str += i;
return isMatch(str+1, pattern) || isMatch(str, pattern+1);
}
else {
return false;
}
}
else{
++i;
}
}
return isMatch(str + i, pattern + i); //匹配剩下的部分(串尾)
}
}
int main()
{
cout<<isMatch("aa","a")<<endl;
cout<<isMatch("aa","aa")<<endl;
cout<<isMatch("aaa","aa")<<endl;
cout<<isMatch("aa", "*")<<endl;
cout<<isMatch("aa", "a*")<<endl;
cout<<isMatch("ab", "?*")<<endl;
cout<<isMatch("aab", "c*a*b")<<endl;
return 0;
}