自学内容网 自学内容网

44.通配符匹配

笔试题碰到的,实在不会做,加油吧刷题找工作。

题目链接

. - 力扣(LeetCode)

官方题解

dp[i][j]表示p数组中的前j个字符是否能完全匹配s数组中的前i个字符

class Solution {
    public boolean isMatch(String s, String p) {
        int m = s.length();
        int n = p.length();
        boolean[][] dp = new boolean[m+1][n+1];//前
        dp[0][0] = true;
        for(int i = 1; i <= n; i++){//重要
            if(p.charAt(i-1) == '*'){//初始化当i = 0, 什么东西能让dp[0][j] 合格,显然只有'*',只有*匹配空字符串
                dp[0][i] = true;
            }else{//如果第一个不是*那后面的也不用想了,需要完全匹配才行
                break;
            }
        }
        for(int i = 1; i <= m; i++){
            for(int j = 1; j <= n; ++j){
                if(p.charAt(j-1) == '*'){//状态转移方程
                    dp[i][j] = dp[i][j-1] || dp[i-1][j];//用的话,
                }else if(p.charAt(j-1) == '?' || s.charAt(i-1) == p.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1];
                }
            }
        }
    return dp[m][n];
    }
}

收获

难点1

初始化,dp[0][j](j > 0),由于此时s是空字符串,所以j必须是‘*’才行,只要不算‘*’就是false,由于需要完全匹配,所以必须一直'*'

当然dp[0][0]=true;

由于boolean数组初始化为false,所以要自己调成true。

对于dp[i][0]来说,p数组全是空无法匹配全是false无需手动赋值。

难点2

当p[j]是*时,dp[i][j]的转移方程。

用的话,dp[i][j] = dp[i][j - 1], 你可以理解为不消耗*的情况下将前i个字符完全匹配了,因为*可以匹配多个后面还能用。

那什么时候才消耗完呢,其实就是在某次不用*的时候,这个时候就没了。

不用,dp[i][j] = dp[i-1][j],画一下可以理解为这个p[j]为空字符串,没什么用。


如何递归很难理解,但想清楚就好了。


原文地址:https://blog.csdn.net/the_singular/article/details/142696353

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!