题解 | #正则表达式匹配#

正则表达式匹配

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
     /**
        思路:
        创建二维dp , dp[i][j] 表示str前i位 与 pattern前j位是否匹配

        1.如果str[i] == pattern[j] || pattern[j] == "."
        表示匹配 那么它的状态取决于它的上一个状态 dp[i][j] = dp[i-1][j-1]
        如果不满足上面的状态 那么判断 当前pattern[j]是否为*
        如果是* 那么还是可以发生状态转移
        2.1如果 pattern[j] == "*" && pattern[j-1]==str[i]
        那么表示 例如a* 可以匹配0个字符、1个字符、多个字符
        2.1.1如果 a*匹配的是0个字符
        那么 dp[i][j] = dp[i][j-2]   #pattern去掉 一个* 和一个 a
        2.1.2如果 a*只匹配1个字符 例如 a*匹配a
        那么 dp[i][j] = dp[i-1][j-2]  #既然匹配了 则要判断上次状态
        2.1.3如果 a*匹配多个字符  例如 a*匹配aaa...
        那么 dp[i][j] = dp[i-1][j]   #str去掉一个字符 再次判断上一次状态 直到判断到2.2为止
        2.2如果 pattern[j] == "*"  但是 pattern[j-1]!=str[i] 表示0次匹配
        dp[i][j] = dp[i][j-2]
        3.如果1、2条件都不满足表示不能发生匹配 则默认false 然后continue;
        
     
      */
    public boolean match (String str, String pattern) {
        // write code here
        int m = str.length();
        int n = pattern.length();


        //创建二维状态dp
        boolean dp[][] = new boolean[m+1][n+1];

        //当字符串 和 正则式都为空时 匹配成功
        dp[0][0] = true;

        //初始化dp
        //1.当str不为空 pattern为空时 匹配失败 默认false
        //2.当str为空 pattern不为空时 要判断是否有* 且只会发生空匹配

        for(int i = 1 ; i <= n ; i++){
            if(i >= 2 && pattern.charAt(i-1)=='*' ){
                dp[0][i] = dp[0][i-2];
            }
        }

        for(int i = 1 ; i <= m ; i++){
            for(int j = 1 ; j <= n ; j++){
                if(str.charAt(i-1) == pattern.charAt(j-1) || pattern.charAt(j-1)=='.'){
                    dp[i][j] = dp[i-1][j-1];
                }else if(j >= 2 && pattern.charAt(j-1) == '*'  ){
                    if(str.charAt(i-1) == pattern.charAt(j-2) || pattern.charAt(j-2) == '.'){
                        //可能发生0次 | 1次 |多次 匹配
                        dp[i][j] = dp[i][j-2] | dp[i-1][j-2] | dp[i-1][j];
                    }else{
                        dp[i][j] = dp[i][j-2];
                    }
                }else{
                    continue;
                }
            }
        }


        return dp[m][n];
    }
}

全部评论

相关推荐

程序员牛肉:你这简历有啥值得拷打的?在牛客你这种简历一抓一大把,也就是个人信息不一样而已。 关键要去找亮点,亮点啊,整个简历都跟流水线生产出来的一样。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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