您的位置:首页 > 其它

40 - Wildcard Matching

2013-10-13 13:59 176 查看
Implement wildcard pattern matching with support for 
'?'
 and 
'*'
.
'?' 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


solution: 第一种方法是递归来做,主要处理*p == ‘*’的情况和遇到?和结尾,若都不对应则返回false,不过太低效过不了large test。

class Solution {
public:
bool isMatch(const char *s, const char *p) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(*p == '*')
{
while(*p == '*')
++p;
if(*p == '\0')
return true;
while(!isMatch(s,p) && *s != '\0')
{
s++;
}

return *s != '\0';
}
else if(*s == *p || *p == '?')
{
return isMatch(++s, ++p);
}
else if(*s == '\0' || *p == '\0')
{
return *s == *p;
}
else
return false;
}
};


第二个方法也是参考http://fisherlei.blogspot.com/2013/01/leetcode-wildcard-matching.html,遇到*的时候,开始循环,保存当前的p和s的指针,然后继续比对,如果最后不等,则返回到p和s+1继续比较。这个方法;高效很多。

class Solution {
public:
bool isMatch(const char *s, const char *p) {
// Note: The Solution object is instantiated only once and is reused by each test case.
const char *sstr = s;
const char *pstr = p;
bool hasStar = false;
for(;*sstr != '\0'; sstr++, pstr++)
{
switch(*pstr)
{
case '?':
break;
case '*':
{
hasStar = true;
s = sstr;
p = pstr;
while(*p == '*')
++p;
if(*p == '\0')
return true;
sstr = s - 1;
pstr = p - 1;

}
break;
default:
{
if(*sstr != *pstr)
{
if(!hasStar)
return false;
s++;
pstr = p - 1;
sstr = s - 1;
}
}
}
}
while(*pstr == '*')
++pstr;
return (*pstr == '\0');
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: