1 class Solution 2 { 3 // 状态 dp[i][j] : 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配 (true 的话表示匹配) 4 // 状态转移方程: 5 // 1. 当 s[i] == p[j],或者 p[j] == ? 那么 dp[i][j] = dp[i - 1][j - 1]; 6 // 2. 当 p[j] == * 那么 dp[i][j] = dp[i][j - 1] || dp[i - 1][j] 其中: 7 // dp[i][j - 1] 表示 * 代表的是空字符,例如 ab, ab* 8 // dp[i - 1][j] 表示 * 代表的是非空字符,例如 abcd, ab* 9 // 初始化: 10 // 1. dp[0][0] 表示什么都没有,其值为 true 11 // 2. 第一行 dp[0][j],换句话说,s 为空,与 p 匹配,所以只要 p 开始为 * 才为 true 12 // 3. 第一列 dp[i][0],当然全部为 false 13 public: 14 bool isMatch(string s, string p) 15 { 16 int m = s.length(); 17 int n = p.length(); 18 19 // 状态 dp[i][j] : 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配 20 vector<vector<int>> dp(m + 1,vector<int>(n + 1,0)); 21 // 初始化 22 dp[0][0] = true; 23 for (int j = 1; j <= n; j++) 24 { 25 if(p[j - 1] == '*') dp[0][j] = dp[0][j - 1]; 26 } 27 28 // 状态转移 29 for (int i = 1; i <= m; i++) 30 { 31 for (int j = 1; j <= n; j++) 32 { 33 if (s[i - 1] == p[j - 1] || p[j - 1] == '?') 34 { 35 dp[i][j] = dp[i - 1][j - 1]; 36 } 37 else if (p[j - 1] == '*') 38 { 39 dp[i][j] = dp[i][j - 1] || dp[i - 1][j - 1] || dp[i - 1][j]; 40 } 41 } 42 } 43 44 // 返回结果 45 return dp[m][n]; 46 } 47 };