0动态规划/字符串困难 LeetCode44. 通配符匹配 NC44 通配符匹配

44. 通配符匹配

描述

给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何单个字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

分析

参考:https://leetcode-cn.com/problems/wildcard-matching/solution/gong-shui-san-xie-xiang-jie-dong-tai-gui-ifyx/
动态转移方程:
当s.charAt(i) == p.charAt(j) || p.charAt(j) == '?'时: dp[i][j] = dp[i][j-1] || dp[i-1][j]
当p.charAt(j) == '*'时: dp[i][j] = dp[i-1][j-1]

除了要想到用动态规划来计算很困难,怎么初始化也很困难。
给s,p头部插入一个字符,dp[0][0]为true,这样方便计算,同时dp[0][0]为true,也表示s,p都为空时,返回true。
i要从0开始遍历,j从1开始遍历。因为当s为空时,p可以不为空;但p为空时,s不管是怎样,结果一定是不匹配。
在这里插入图片描述
在这里插入图片描述

class Solution {
    
    
    public boolean isMatch(String s, String p) {
    
    
        s = " "+s;
        p = " "+p;
        boolean[][] dp = new boolean[s.length()][p.length()];
        dp[0][0] = true;
        //
        for(int i = 0; i < s.length(); i++){
    
    
            for(int j = 1; j < p.length(); j++){
    
    
                if(i > 0 && s.charAt(i) == p.charAt(j) || i > 0 && p.charAt(j) == '?'){
    
    
                    dp[i][j] = dp[i-1][j-1];
                }
                if(p.charAt(j) == '*'){
    
    
                    dp[i][j] = dp[i][j-1] || (i > 0 && dp[i-1][j]);
                }
            }
        }
        return dp[s.length()-1][p.length()-1];
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43260719/article/details/121590361