Java剑指Offer正则表达式匹配

        请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。

        使用动态规划

class Solution {
    public boolean isMatch(String s, String p) {
        int m = s.length() + 1;
        int n = p.length() + 1;
        boolean[][] dp = new boolean[m][n];
        //空字符串肯定匹配
        dp[0][0] = true;

        //初始化
        for(int i = 2;i < n;i += 2){
            //当偶数位为*时才能匹配
            dp[0][i] = dp[0][i-2] && p.charAt(i-1) == '*';
        }

        for(int i = 1;i < m;i++){
            for(int j = 1;j < n;j++){
                //索引从0开始,对应字符索引要减1
                if(p.charAt(j-1) == '*'){
                    //1、如果p最后一个字符为*,判断把p最后两个字符去了可不可以匹配
                    //即*前的字符出现0次
                    if(dp[i][j-2]){
                        dp[i][j] = true;
                    }
                    //2、如果p最后一个字符为*,且s的前i-1位和p的前j位相匹配,
                    //并且s的最后一个字符和p倒数第二个字符(*前的字符)相同,
                    //即*前的字符和s结尾字符有多个重合,让它多出现1次时,能否匹配;
                    else if(dp[i-1][j] && s.charAt(i-1) == p.charAt(j-2)){
                        dp[i][j] = true;
                    }
                    //3、如果p最后一个字符为*,且s的前i-1位和p的前j位相匹配,
                    //*前为.时,它多出现1次时,能否匹配;
                    else if(dp[i-1][j] && p.charAt(j-2) == '.'){
                        dp[i][j] = true;
                    }

                }else{
                    if(dp[i-1][j-1] && s.charAt(i-1) == p.charAt(j-1)){
                        dp[i][j] = true;
                    }else if(dp[i-1][j-1] &&p.charAt(j-1) == '.'){
                        dp[i][j] = true;
                    }
                }
            }
        }
        return dp[m-1][n-1];

    }
}

执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:40 MB, 在所有 Java 提交中击败了58.59%的用户

通过测试用例:448 / 448

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值