二刷10. Regular Expression Matching

这道题这次算是刷透了,算是比较稳妥的解法,现场能解释清楚。

class Solution {
    /*
       s:"" a b c c e f
    p:      
    ""   T  F F
    a    F  T     |
    b    F    T   |
    c             |   
    * ------------T        
    d
        1
        
        
       s:"" a b c c e f
    p:      
    ""   T  F F
    a    F  T     |
    b    F    T   |
    d             |   
    * ------------F        
    d
    
        2
    
    match[i][j]: does p[1, i] match s[1, j] (i, j is num of chars not index)
    eg. match[3][3] here means does p = "abd" match s = "abc"
    
    
    1.s.charAt(j - 1) == p.charAt(i - 1) || p.charAt(i - 1) == '.'   
      match[i][j] = match[i - 1][j - 1]
      s == "ab"
      p == "ab"
      
    2. p.charAt(i - 1) == '*'
       2.1 p.charAt(i - 2) == s.charAt(j - 1) || p.charAt(i - 2) == '.' 
           eg. match[4][4] in 1, 
               s == "abcc",
               p == "abc*"
               match[i][j] if match[i][j - 1] || match[i - 2][j]
               meaning we can use * as multiple or zero to make a match
       2.2 eg. match[4][4] in 2, 
               s == "abcc"
               p == "abd*"
               match[i][j] = match[i - 2][j]
               can only match if we use * as zero and delete p.charAt(i - 1) and p.charAt(i - 2)
    */
    public boolean isMatch(String s, String p) {
        int sLen = s.length();
        int pLen = p.length();
        boolean[][] match = new boolean[pLen + 1][sLen + 1];
        match[0][0] = true;
        for (int i = 1; i < pLen + 1; i++){
            if (p.charAt(i - 1) == '*' && match[i - 2][0]){
                match[i][0] = true;
            }
        }
        for (int i = 1; i < pLen + 1; i++){
            for (int j = 1; j < sLen + 1; j++){
                if (p.charAt(i - 1) == s.charAt(j - 1) || p.charAt(i - 1) == '.'){
                    match[i][j] = match[i - 1][j - 1];
                } else if (p.charAt(i - 1) == '*'){
                    //* could mean zero or multiple to make a match in this scenerio
                    if (p.charAt(i - 2) == s.charAt(j - 1) || p.charAt( i - 2) == '.'){
                        match[i][j] = match[i][j - 1] || match[i - 2][j];
                    //* could mean only mean zero in this case to make a possible match
                    } else {
                        match[i][j] = match[i - 2][j];
                    }
                }
            }
        }
        return match[pLen][sLen];
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 当11月21日巴厘岛阿贡火山预警时, 我还是坚定地选择了按原计划去巴厘岛旅行。在内心深处,这是场非走不可的旅行,之...
    北京沸腾鱼阅读 3,068评论 0 1
  • 叮呤,丁呤,细碎的铃铛撞击声由远及近,一个灰袍老道骑着毛驴,悠哉悠哉地走来,忽而他皱眉看见了倒在血泊中的悟心。 “...
    杨柳青青江水平阅读 2,806评论 0 0
  • 有句话这样说,要抓住男人的心首先要抓住他的胃。 现实生活中,美食是一个很美好的存在,不然就不会有很多人自诩为“吃货...
    茗语阅读 2,472评论 0 1
  • “哎呀~人家就是你的情家前辈了啦~” 情万愁言道。 马德……有什么办法可以将这个踢出精神空间…… 情川额头满是黑线...
    总有宫女想非礼朕阅读 1,562评论 0 2

友情链接更多精彩内容