题目描述
请实现支持'?'and'*'.的通配符模式匹配
'?' 可以匹配任何单个字符。
'*' 可以匹配任何字符序列(包括空序列)。
返回两个字符串是否匹配
函数声明为:
bool isMatch(const char *s, const char *p)
下面给出一些样例:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "d*a*b") → false
示例1
输入
"ab","?*"
返回值
true
class Solution {
public:
bool isMatch(const char *s, const char *p) {
if(*s == '\0')
{
if(*p == '\0')
{
return true;
}
else
{
if(*p == '*')
{
return isMatch(s, p+1);
}
else
{
return false;
}
}
}
else
{
if(*p == *s || *p == '?')
{
if(strlen(p) == 1 && strlen(s) == 1)
return true;
else
return isMatch(s+1, p+1);
}
else if(*p == '*')
{
if(strlen(p) == 1)
{
return true;
}
else if(isMatch(s, p+1))
{
return true;
}
else
{
return isMatch(s+1, p);
}
}
else
{
return false;
}
}
}
};
解题中。。。
上面这个解题方法,应该没问题。只是时间太长。下面是效率高的解题方法,不需要递归运算。
解题思路:使用回溯的方法。记录节点。
class Solution {
public:
bool isMatch(const char *s, const char *p) {
int s_index = 0;
int p_index = 0;
int s_recall = 0;
int p_recall = 0;
while(s[s_index] != '\0')
{
if(s[s_index] == p[p_index] || p[p_index] == '?')
{
s_index++;
p_index++;
}
else if(p[p_index] == '*')
{
p_index++;
s_recall = s_index+1;
p_recall = p_index;
}
else if(p_recall)
{
s_index = s_recall;
p_index = p_recall;
s_recall = s_index+1;
}
else
{
return false;
}
}
while(p[p_index] == '*')
{
p_index++;
}
return (p[p_index] == '\0' ? true : false);
}
};