leetcode-44-线性DP-通配符匹配

题目

1.png

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size();
int n = p.size();

// 状态 dp[i][j] : 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配 (true 的话表示匹配)
// 状态转移方程:
// 1. 当 s[i] == p[j],或者 p[j] == ? 那么 dp[i][j] = dp[i - 1][j - 1];
// 2. 当 p[j] == * 那么 dp[i][j] = dp[i][j - 1] || dp[i - 1][j] 其中:
// dp[i][j - 1] 表示 * 代表的是空字符,例如 ab, ab*
// dp[i - 1][j] 表示 * 代表的是非空字符,例如 abcd, ab*
// 初始化:
// 1. dp[0][0] 表示什么都没有,其值为 true
// 2. 第一行 dp[0][j],换句话说,s 为空,与 p 匹配,所以只要 p 开始为 * 才为 true
// 3. 第一列 dp[i][0],当然全部为 false
vector<vector<bool>> dp(m+1, vector<bool>(n+1, false));
dp[0][0] = true;
for(int i = 1; i <= n; ++i) dp[0][i] = dp[0][i-1] && p[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][j-1] || dp[i-1][j];
}
}
}

return dp[m][n];
}
};