Description
Given an input string (s) and a pattern §, 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).
Note:
- s could be empty and contains only lowercase letters a-z.
- p could be empty and contains only lowercase letters a-z, and characters like ? or *.
Example 1:
Input:
s = "aa"
p = "a"
Output:
false
Explanation:
"a" does not match the entire string "aa".
Example 2:
Input:
s = "aa"
p = "*"
Output:
true
Explanation:
'*' matches any sequence.
Example 3:
Input:
s = "cb"
p = "?a"
Output:
false
Explanation:
'?' matches 'c', but the second letter is 'a', which does not match 'b'.
Example 4:
Input:
s = "adceb"
p = "*a*b"
Output:
true
Explanation:
The first '*' matches the empty sequence, while the second '*' matches the substring "dce".
Example 5:
Input:
s = "acdcb"
p = "a*c?b"
Output:
false
分析
题目的意思是:通配符匹配问题。
p[i][j]表示s[i-1]与p[j-1]是否匹配。
递推关系式:
1.dp[i][j] = dp[i-1][j-1]. 如果p[j-1]=='?' 或 s[i-1] == p[j-1]
2.dp[i][j] = dp[i-1][j] || dp[i][j-1].
dp[i-1][j]表示保留p中的*,可以匹配s中跟多字符,dp[i][j-1]表示p中的匹配空字符
初始状态:s="", p="“应该返回true, s=”", p="“应该返回true, 其他初始状态如:s=”", p="ab*"应该返回false.
代码
class Solution {
public:
bool isMatch(string s, string p) {
int m=s.length();
int n=p.length();
vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));
dp[0][0]=true;
for(int i=1;i<=n;i++){
if(p[i-1]=='*') dp[0][i]=dp[0][i-1];
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(s[i-1]==p[j-1]||p[j-1]=='?'){
dp[i][j]=dp[i-1][j-1];
}else if(p[j-1]=='*'){
dp[i][j]=dp[i-1][j]||dp[i][j-1];
}
}
}
return dp[m][n];
}
};