44. 通配符匹配

题目链接:44. 通配符匹配 - 力扣(LeetCode)

 

 

 

 

 

 

 

 

 

 

解析:

dp看终态,dp[n][m]可以通过dp[n - 1][m]、dp[n][m - 1]、dp[n - 1][m - 1]转移

接下来看什么条件下会转移

当m = '*'时,

dp[i][j] = (dp[i - 1][j] || dp[i][j - 1] || dp[i - 1][j - 1]);
当m != ‘*’时
说明s[n]必定要与p[m]进行匹配
if (s[i] == p[j] || p[j] == '?') dp[i][j] = dp[i - 1][j - 1]
否则就是false
 
状态转移方程还是很好推的,主要是初态
直接看代码吧
class Solution {
public:
    bool isMatch(string s, string p) {
        bool dp[2010][2010];
        int n = s.size(), m = p.size();
        if (n == 0 && m == 0) return true;
        else if (n == 0) {
            int k = 0;
            for(; k < m && p[k] == '*'; k++);
            if (k == m) return true;
            return false;
        } else if (m == 0) return false;



        if (s[0] == p[0] || p[0] == '?' || p[0] == '*') dp[0][0] = true;
        else dp[0][0] = false;

        for (int i = 1; i < n; i++) {
            dp[i][0] = (dp[i - 1][0] && p[0] == '*');
        }
        bool p_star_flag = true;
        if (p[0] != '*') p_star_flag = false;
        for (int j = 1; j < m; j++) {
            dp[0][j] = (dp[0][j - 1] && (p[j] == '*' || (s[0] == p[j] || p[j] == '?') && p_star_flag));
            if (p[j] != '*') p_star_flag = false;
        }
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                if (p[j] == '*') {
                    dp[i][j] = (dp[i - 1][j] || dp[i][j - 1] || dp[i - 1][j - 1]);
                } else {
                    if (s[i] == p[j] || p[j] == '?') dp[i][j] = dp[i - 1][j - 1];
                    else dp[i][j] = false;
                }
            }
        }
       return dp[n - 1][m - 1];
    }
};

 

 
posted @ 2025-08-19 23:00  WTSRUVF  阅读(8)  评论(0)    收藏  举报