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
思路一:
代码如下:
class Solution {
public:
bool isMatch(string s, string p) {
int sIndex=0,pIndex=0,match=0,starIdx=-1;
while(sIndex < s.length())
{
if(pIndex < p.length() && (p[pIndex] == '?' || p[pIndex] == s[sIndex]))
{
pIndex++;
sIndex++;
}
else if(pIndex < p.length() && p[pIndex] == '*')
{
starIdx = pIndex;
pIndex++;
match = sIndex;
}
else if(starIdx!=-1)
{
pIndex = starIdx+1;
match++;
sIndex = match;
}
else
return false;
}
while(pIndex<p.length() && p[pIndex] == '*')
pIndex++;
return pIndex == p.length();
}
};
思路二:使用大杀器 -动态规划,列出动态方程如下:
if p[j-1] != '*', then dp[i][j] = dp[i-1][j-1] && (s[i-1] == p[j-1] || p[j-1] == '?')
if p[j-1] == '*', then dp[i][j] = dp[i-1][j] || dp[i][j-1]
需要注意的是dp方程组的初始化,dp[0][i](i=1,2,3...)根据p来进行,因为*可以代表空,所以当开头字串为*时,需要在dp[0][i]中相应位置设为true。 最后dp[0][0]设置为true
代码如下:
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.length(),n=p.length();
bool dp[m+1][n+1];
memset(dp,false,sizeof(bool)*(m+1)*(n+1));
dp[0][0] = true;
for(int i=1;i<=n;i++)
{
if(p[i-1] == '*')
dp[0][i] = true;
else
break;
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(p[j-1] != '*')
dp[i][j] = dp[i-1][j-1] && (s[i-1] == p[j-1] || p[j-1] == '?');
else if(p[j-1] == '*')
dp[i][j] = dp[i-1][j] || dp[i][j-1];
}
return dp[m][n];
}
};