44. 通配符匹配

2020-08-08  本文已影响0人  justonemoretry

自己解法

这个题有的印象是,用动态规划,p的某一位要判断是否是*。

p不是*的情况下,解法简单,dp[i][j] = dp[i - 1][j - 1] && i 和 j位置上的元素相等或j为?可以匹配任意单字符。

p是* 的情况下,分为使用*和不使用*的情况:

使用*:dp[i][j] = dp[i-1][j],这个本来理解的是,dp[i][j] = dp[i-1][j-1],这种情况下是使用了*,

但是,这个*有可能是代表多个字符,也就是说在这次匹配之前就已经使用了*,这种情况下dp[i][j]应该等于dp[i-1][j]。

不使用*:dp[i][j]=dp[i][j-1],也就是说i和j-1的位置已经匹配不用再要*了。

小结:二维数组的动态规划问题,一般都是一层一层铺开的,所以这点决定了数组的生成方式,我最开始是陷进了dp[i][j] = dp[i-1][j-1]的怪圈,这样只能拿对角线的值了,尴尬。

class Solution {

    public boolean isMatch(String s, String p) {

        int sLen = s.length();

        int pLen = p.length();

        boolean[][] dp = new boolean[sLen + 1][pLen + 1]; 

        dp[0][0] = true;

        for (int i = 1; i <= pLen; i++) {

            if (p.charAt(i - 1) == '*') {

                dp[0][i] = true;

            } else {

                break;

            }

        }

        for (int i = 1; i <= sLen; i++) {

            for (int j = 1; j <= pLen; j++) {

                if (p.charAt(j - 1) != '*') {

                    dp[i][j] = dp[i - 1][j - 1] 

                        && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?');

                } else {

                    dp[i][j] = dp[i - 1][j] || dp[i][j - 1];   

                }

            }

        }

        return dp[sLen][pLen];       

    }

}

官方解法:

自己解法参考官方,不再赘述

上一篇 下一篇

猜你喜欢

热点阅读