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
字符串匹配,?代表一个字符,*代表任意字符串
比较容易想到的是深搜,我一开始也是这么做的,然后发现跑得比较慢,
看到有人用DP做,不过速度也不是太快,
再后来看到了贪心!
?和匹配的字符正常匹配,遇到*记录两个串当前的位置,并默认*为空串,继续往后
遇到无法匹配的情况,返回上一个*号的位置,增加*的匹配字符数。
为什么只返回上一个*,不用管前面的呢?
因为即使前面的*少表示了若干个字符,在两个*中间全部匹配的情况下,后面的*也可以表示前面少掉的若干字符!
虽然复杂度不是线性的,但是比起直接暴搜少了很多情况。
class Solution {
public:
bool isMatch(string s, string p) {
int ss=0,ps=0,spos=-1,ppos=-1;
while(ss<s.size())
{
if(s[ss]==p[ps] || p[ps]=='?')
{
ss++;
ps++;
}
else if(p[ps]=='*')
{
spos=ss;
ppos=ps++;
}
else
{
if(ppos>-1)
{
ss=++spos;
ps=ppos+1;
}
else
return false;
}
}
while(p[ps]=='*') ps++;
return ps==p.size();
}
};