美文网首页动态规划
lintcode192 Wildcard Matching

lintcode192 Wildcard Matching

作者: Anseis | 来源:发表于2018-04-08 11:45 被阅读0次

    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

        本文链接:https://www.haomeiwen.com/subject/gpyphftx.html