class Solution { public: bool match(string str, string pattern) { int n = (int)str.size(), m = (int)pattern.size(); vector<vector<bool>> dp(n + 1, vector<bool>(m + 1, false)); dp[0][0] = true; // 空串匹配:形如 a*, a*b*, ... for (int j = 2; j <= m; ++j) { if (pattern[j - 1] == '*') dp[0][j] = dp[0][j - 2]; } auto same = [&](char s, char p) { return p == '.' || p == s; }; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (pattern[j - 1] != '*') { if (same(str[i - 1], pattern[j - 1])) dp[i][j] = dp[i - 1][j - 1]; } else { // '*' // 0 次 dp[i][j] = dp[i][j - 2]; // ≥1 次 if (same(str[i - 1], pattern[j - 2])) dp[i][j] = dp[i][j] || dp[i - 1][j]; } } } return dp[n][m]; } };