lintcode192 Wildcard Matching

Wildcard Matching

这题和正则表达式那道题极其相似,不过这里 * 作用改变了,它自己代表匹配任意字符串的作用

首先建立二维boolean array dp[s.length+1][p.length+1],代表s的第几个字符和p的第几个字符是否达到匹配

首先dp[0][0] = true, 以及dp[i][0]都为false

然后对dp[0][j] 进行初始化,可知存在“*”的情况,所以要对这个处理下

然后两个for loop, 分别是对i j 的匹配关系

  1. 如果遍历到的p[j] 是'?' 或者等于s[i],那么此时dp[i+1][j+1] = dp[i][j]

  2. 如果遍历到的是'*', 不用像正则表达式那题分星号前面是否匹配的情况考虑,因为前面不匹配,有星号也没有用了,这里的星号失去了消除前一个字符的作用
    dp[i+1][j+1] = dp[i][j+1] 说明 * 已经匹配s[i]前面字符串,所以s[i]也被 * 匹配到了
    dp[i+1][j+1] = dp[i+1][j] 说明 * 前面已经匹配
    dp[i+1][j+1] = dp[i][j] 说明 * 前面的字符和s[i] 前面字符已经匹配了。(其实这个多余讨论,第一种情况已经包含了,只不过我重复说了下)

代码如下

public class Solution {
    /**
     * @param s: A string 
     * @param p: A string includes "?" and "*"
     * @return: is Match?
     */
    public boolean isMatch(String s, String p) {
        // write your code here
        if(s == null || p == null){
            return false;
        }
        
        boolean[][] dp = new boolean[s.length()+1][p.length()+1];
        
        dp[0][0] = true;
        char[] ss = s.toCharArray();
        char[] pp = p.toCharArray();

        for(int i = 0; i < pp.length; i++){
            if(pp[i] == '*' && dp[0][i])
            dp[0][i + 1] = true;
        }
        
        for(int i = 0; i < ss.length; i++){
            for(int j = 0; j < pp.length; j++){
                if(pp[j] == '?' || pp[j] == ss[i]){
                    dp[i+1][j+1] = dp[i][j];
                }
                
                if(pp[j] == '*'){
                    dp[i+1][j+1] =  dp[i][j] || dp[i][j + 1] || dp[i+1][j];
                }
            }
        }
        return dp[ss.length][pp.length];
    }
}

你可能感兴趣的:(lintcode192 Wildcard Matching)