一、选择题
eg1
eg2
eg3
eg4
eg5
二、编程题
eg1
【解题思路】:
本题可以通过递归求解。从前向后一次匹配,遇到相同字符,都向后移动一个字符,如果通配符遇到"?“,则不需匹配,自动跳过一个字符,如果通配符遇到”*",则可以匹配任意多个字符,包括0个,此时可以有三种选择,1,匹配0个,通配符向后移动一个字符,字符串不动。2,匹配1个,通配符和字符串都向后移动一个字符。3,匹配多个,通配符不动,字符串向后移动一个字符。递归的终止条件:通配符或者字符串遇到’\0’。当他们同时结束。
#include <iostream>
#include <string>
using namespace std;
bool strMach(const char* pattern, const char* s)
{
if(*pattern == '\0' && *s == '\0')
return true;
//其中一个为'\0’
if(*pattern == '\0' || *s == '\0')
return false;
//当前字符相等
if(tolower(*pattern) == tolower(*s))
return strMach(pattern + 1, s + 1);
//?匹配一个字符
else if(*pattern == '?')
{
if(!isdigit(*s) && !isalpha(*s))
return strMach(pattern+1, s);
return strMach(pattern + 1, s + 1);
}
//*匹配一个或则多个字符
else if(*pattern == '*')
{
while (*pattern == '*')
{
pattern++;
}
pattern--;
if(!isdigit(*s) && !isalpha(*s))
return false;
return strMach(pattern + 1, s) || strMach(pattern+1, s + 1) || strMach(pattern, s + 1);
}
//匹配不成功
else
return false;
}
int main()
{
string pattern;
string s;
while(cin >> pattern >> s)
{
bool ret = strMach(pattern.c_str(), s.c_str());
if(ret)
cout << "true" << endl;
else
cout << "false" << endl;
}
return 0;
}