WildCard matching

https://leetcode.com/problems/wildcard-matching/description/

hard题 ,
很明显可以用dp来做,(可以缩小成小一号的问题)
难点在于有* 又有?号
对于这种问题,我们一般就分情况讨论就好了,不必紧张。
如果没有*? 则比较最后两个字符
如果最后一个是?, 则等于各减去一个字符的结果。
如果最后一个是 *, 则这个 *可以表示0 到多个,这里 trick在于取 0个不留*号,或者取一个然后保留 *号。
这道题和Regular expression matching很像,做完这道可以看下那一道

 public boolean isMatch(String s, String p) {
        boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
        for (int i = 0; i <= s.length(); i++) {
            for (int j = 0; j <= p.length(); j++) {
                if (i == 0 && j == 0) {
                    dp[i][j] = true;
                } else if ( i != 0 && j == 0) {
                    continue; // default to false;
                } else {
                    if ("*?".indexOf(p.charAt(j - 1)) < 0) {
                        if (i == 0 || p.charAt(j - 1) != s.charAt(i - 1) ) {
                            ; // default to false;
                        } else {
                            dp[i][j] = dp[i - 1][j - 1];
                        }
                    } else if (p.charAt(j - 1) == '?') {
                        if (i != 0) dp[i][j] = dp[i - 1][j - 1];
                    } else if (p.charAt(j - 1) == '*') { // * 取0个,*取一个
                        dp[i][j] = dp[i][j - 1];// * 取0个,
                        if (i != 0) dp[i][j] |= dp[i - 1][j]; //*取一个
                    }
                }
            }
        }
        return dp[s.length()][p.length()];
    }

你可能感兴趣的:(WildCard matching)