题目:
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
思路1 动态规划
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size(), n = p.size();
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
dp[0][0] = true;
for(int i = 1; i <= m; i++)
dp[i][0] = false;
for(int j = 1; j <= n; j++)
dp[0][j] = dp[0][j - 1] && p[j - 1] == '*';
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] || dp[i - 1][j] || dp[i][j - 1];
else
dp[i][j] = dp[i - 1][j - 1] && (s[i - 1] == p[j - 1] || p[j - 1] == '?') ;
}
return dp[m][n];
}
};
思路2 回溯算法
当s[i] == p[j]时i++ j++
当p[j]=='*'时,用iStar和jStar记录当前的i,j
当p[j] != s[i] && p[j] != '?'时,
回溯,j回溯到jstar+1,istar++;i=istar
最后就是简单的判断了
小节
思路2的算法思想较简单,但是用代码实现就要小心好多坑了,花了不少时间(看来目前写代码功力并不6啊)
Tips:对于不好理解的算法,可以用编辑器在每次循环将关键的变量打印出来(cout<<'i='<<i ... ...),帮助直观理解。( 抽象-》直观)
bool isMatch(string s, string p) {
int slen = s.size(), plen = p.size(), i, j, iStar=-1, jStar=-1;
for(i=0,j=0 ; i<slen; ++i, ++j)
{
if(p[j]=='*')
{ //meet a new '*', update traceback i/j info
iStar = i;
jStar = j;
--i;
}
else
{
if(p[j]!=s[i] && p[j]!='?')
{ // mismatch happens
if(iStar >=0)
{ // met a '*' before, then do traceback
i = iStar++;
j = jStar;
}
else return false; // otherwise fail
}
}
}
while(p[j]=='*') ++j;
return j==plen;
}