192. 通配符匹配
判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个串完全匹配才算匹配成功。
样例
样例1
输入:
"aa"
"a"
输出: false
输出2
输入:
"aa"
"aa"
输出: true
输出3
输入:
"aaa"
"aa"
输出: false
输出4
输入:
"aa"
"*"
输出: true
说明: '*' 可以替换任何字符串
输出5
输入:
"aa"
"a*"
输出: true
样例6
输入:
"ab"
"?*"
输出: true
说明: '?' -> 'a' '*' -> 'b'
样例7
输入:
"aab"
"c*a*b"
输出: false
注意事项
1<=|s|, |p| <= 1000
s仅包含小写英文字母
p包含小写英文字母,?和 *
bool isMatch(string &s, string &p) {
// write your code here
int sSize = s.size();
int pSize = p.size();
if (sSize == 0)
{
if (pSize == 0)
{
return true;
}
int i = 0;
while (p[i] == '*')
{
i++;
}
if (i < pSize)
{
return false;
}
return true;
}
vector<vector<bool>> dp = vector<vector<bool>>(pSize + 1, vector<bool>(sSize + 1, false));
//第一行,特殊处理
if (pSize > 0)
{
if (p[0] == '*')
{
for (int j = 0; j < sSize + 1; j++)
{
dp[0][j] = true;
}
}
else if ('?' == p[0])
{
dp[0][0] = true;
}
else
{
for (int j = 0; j < sSize + 1; j++)
{
if (s[j] == p[0])
{
dp[0][j] = true;
break;
}
}
}
}
for (int i = 1; i < pSize + 1; i++)
{
bool bFind = false;//上一行是否出现 true
if ('*' == p[i])
{
for (int j = 0; j < sSize + 1; j++)
{
if (false == bFind && dp[i - 1][j] == true)
{
bFind = true;
}
if (true == bFind)
{
dp[i][j] = true;//后面全部是true
}
}
}
else if ('?' == p[i])
{
if ('*' == p[i - 1])
{
if (true == dp[i - 1][0]) //第一列
{
dp[i][0] = true;//后面全部是true
}
}
for (int j = 1; j < sSize + 1; j++)//从第二列开始
{
if (j-1>= 0 && true == dp[i - 1][j - 1]) //斜角上
{
dp[i][j] = true;
}
}
}
else
{
for (int j = 0; j < sSize + 1; j++)
{
if (p[i] == s[j])//字符全匹配
{
if (j-1>= 0 && true == dp[i - 1][j - 1]) //斜角上
{
dp[i][j] = true;
}
}
}
}
}
return dp[pSize][sSize];
}