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

正则表达式匹配

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        // write code here
                if (pattern.length() == 0) {
            return str.length() == 0;
        }
        int n = str.length() + 1;
        int m = pattern.length() + 1;
        boolean[][] dp = new boolean[n][m];
        dp[0][0] = true;
        for (int j = 2; j < m; j = j + 2) {
            if (dp[0][j - 2] && pattern.charAt(j - 1) == '*') {
                dp[0][j] = true;
            }
        }
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                if (pattern.charAt(j - 1) == '*') {
                    dp[i][j] = dp[i][j - 2]
                            || dp[i - 1][j] && (str.charAt(i - 1)
                            == pattern.charAt(j - 2)
                            || pattern.charAt(j - 2) == '.');
                } else {
                    dp[i][j] = dp[i - 1][j - 1] && (str.charAt(i -
                            1) == pattern.charAt(j - 1)
                            || pattern.charAt(j - 1) == '.');
                }
            }
        }
        return dp[n - 1][m - 1];
    }
}

解题思想:动态规划

* 1. ⾸先我们需要 定义状态 :⽤⼀个⼆维数组(套路) dp[i][j] ⽤来表示 str 的前 i 个字符和 pattern 的前 j 个字符是否匹配。

* 2. 接下来,我们需要 初始化简单状态 ,因为想要求后⾯的状态,是依赖于前⾯的状态的,⼀般是初始化 dp[i][j] 的⾸⾏和⾸列。

* dp[0][0]= true ,表示两个空的字符串是匹配的。

* dp 数组的⾸列,除了 dp[0][0] 为 true ,其他的都是 false 。因为pattern为空,但是s不为空的时候,肯定不匹配。

* dp 的⾸⾏,也就是str为空的时候,如果pattern的偶数位都是“*”,那么就可以匹配,因为可以选择匹配0次。

* 3. 初始化前⾯之后,后⾯的从索引 1 开始匹配:

* 1. pattern 的第 j 个字符为“ * ”(即是 pattern[j-1]=='*' )

* 1.1 如果 dp[i][j-2]==true ,那么 dp[i][j]=true (相当于str的前i和pattern的前j-2个字符匹配,此时的 * 前⾯的那个字符出现了 0 次)。

* 1.2 如果 dp[i-1][j]==true 且 str[i-1]==pattern[j-2] ,则 dp[i][j] =true 。(如果 str 的前 i - 1 个字符和 pattern 的前 j 个字符匹配,并且 str 的第 i 个字符和 pattern 的第 j - 1 个字符相等,相当于‘ * ’前⾯的字符出现了 1 次)

* 1.3 如果 dp[i-1][j]=true 且 pattern[j-2]=='.' 的时候,则 dp[i][j]=true 。(表示 str 的前 i-1 个和 patten 的前 j 个匹配,并且 pattern 的第 j-1 个是‘ . ’,第 j 个是‘ * ’,那么说明可以匹配任何字符任何次数,⾃然 str 可以多匹配⼀个字符。)

* 2. pattern 的第 j 个字符不为“ * ”(即是 pattern[j-1]!='*' )

* 2.1 如果 dp[i - 1][j - 1]=true and str[i - 1] == pattern[j- 1] 时,则 dp[i][j]=true 。(也就是前⾯匹配,接下来的字符⼀样匹配)

* 2.2 如果 dp[i - 1][j - 1]=true 且 pattern[i-1]=='.' ,那么 dp[i][j]=true 。(其实也是 . 可以匹配任何字符)

* 处理完数组之后,最后返回 dp[n-1][m-1] ,也就是 str 的前 n 个和 pattern 的前 m个字符是否匹配。

#算法##算法笔记#
全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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