题解 | #正则表达式匹配#动态规划解法

正则表达式匹配

http://www.nowcoder.com/practice/28970c15befb4ff3a264189087b99ad4

这里dp[row][col]的意思是,str的row长度去和pattern的col长度做一个正则匹配是否能成功,所以说此时最后一位字符分别是row-1和col-1位置

    public boolean match (String str, String pattern) {
        if(str==null||pattern==null) return false;
        if(!check(str)) return false;
        int rows = str.length();
        int cols = pattern.length();
        boolean[][] dp = new boolean[rows+1][cols+1];
        //str做行,pattern做列的行列对应模型
        dp[0][0] = true;
        for(int col = 1;col<=cols;col++){
            for(int row = 0;row<=rows;row++){
                //看结尾位置(注意是[row-1]和[col-1]字符)
                char pEnd = pattern.charAt(col-1);
                if(pEnd=='*'){
                    //1.*前的玩意一次都不出现
                    //2.*前的玩意p和sEnd匹配,如果p出现若干次能够使得dp[row-1][col]为true,那再多一次就好了
                    dp[row][col] = dp[row][col-2]||
                        (row>0&&isMatch(str.charAt(row-1),pattern.charAt(col-2))&&dp[row-1][col]);
                }else{
                    //如果不是*,那么只和左上角有关
                    dp[row][col] = row>0&&isMatch(str.charAt(row-1),pEnd)&&dp[row-1][col-1];
                }
            }
        }
        return dp[rows][cols];
    }
    public boolean isMatch(char s,char p){
        return s==p||p=='.';
    }
    public boolean check(String str){
        if("".equals(str)) return true;
        if(str.charAt(0)=='*') return false;
        for(int i = 1;i<str.length();i++){
            //两个*不能连着
            if(str.charAt(i)=='*'&&str.charAt(i-1)=='*'){
                return false;
            }
        }
        return true;
    }
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-29 17:30
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
05-11 20:45
门头沟学院 Java
有担当的灰太狼又在摸...:零帧起手查看图片
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务