• [Hot100]10. 正则表达式匹配


    10. 正则表达式匹配
    困难题
    动态规划:
    dp[i][j] 表示 s 的前 i 个是否能被 p 的前 j 个匹配

    ● 转移方程: 需要注意,由于 dp[0][0] 代表的是空字符的状态, 因此 dp[i][j] 对应的添加字符是 s[i - 1] 和 p[j - 1] 。
    ○ 当 p[j - 1] = ‘*’ 时, dp[i][j] 在当以下任一情况为 true时等于true :
    ■ dp[i][j-2]
    ● 将字符组合 p[j - 2] * 看作出现 0 次时,能否匹配;
    ■ dp[i-1][j]
    ● 且 p[j - 2] = s[i - 1]: 即让字符 p[j - 2]多出现 1 次时,能否匹配;
    ● 且 p[j - 2] = ‘.’:即让字符 ‘.’ 多出现 1 次时,能否匹配;

    ○ 当 p[j - 1] != ‘*’ 时, dp[i][j] 在当以下任一情况为true 时等于 true :
    ■ dp[i - 1][j - 1]
    ● 且 s[i - 1] = p[j - 1]: 即让字符 p[j - 1] 多出现一次时,能否匹配;
    ● 且 p[j - 1] = ‘.’: 即将字符 . 看作字符 s[i - 1] 时,能否匹配;

    class Solution {
        public boolean isMatch(String s, String p) {
            int m = s.length() + 1, n = p.length() + 1;
            boolean[][] dp = new boolean[m][n];
            dp[0][0] = true;
            // 初始化首行
            for(int j = 2; j < n; j += 2)
                dp[0][j] = dp[0][j - 2] && p.charAt(j - 1) == '*';
            // 状态转移
            for(int i = 1; i < m; i++) {
                for(int j = 1; j < n; j++) {
                    if(p.charAt(j - 1) == '*') {
                        if(dp[i][j - 2]) dp[i][j] = true;                                                          
                        // 1.
                        else if(dp[i - 1][j] && s.charAt(i - 1) == p.charAt(j - 2)) dp[i][j] = true; // 2.
                        else if(dp[i - 1][j] && p.charAt(j - 2) == '.') dp[i][j] = true;             // 3.
                    } else {
                        if(dp[i - 1][j - 1] && s.charAt(i - 1) == p.charAt(j - 1)) dp[i][j] = true;  // 1.
                        else if(dp[i - 1][j - 1] && p.charAt(j - 1) == '.') dp[i][j] = true;         // 2.
                    }
                }
            }
            return dp[m - 1][n - 1];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    class Solution {
        public boolean isMatch(String s, String p) {
            int m = s.length();
            int n = p.length();
    
            boolean[][] f = new boolean[m + 1][n + 1];
            f[0][0] = true;
            for (int i = 0; i <= m; ++i) {
                for (int j = 1; j <= n; ++j) {
                    if (p.charAt(j - 1) == '*') {
                        f[i][j] = f[i][j - 2];
                        if (matches(s, p, i, j - 1)) {
                            f[i][j] = f[i][j] || f[i - 1][j];
                        }
                    } else {
                        if (matches(s, p, i, j)) {
                            f[i][j] = f[i - 1][j - 1];
                        }
                    }
                }
            }
            return f[m][n];
        }
    
        public boolean matches(String s, String p, int i, int j) {
            if (i == 0) {
                return false;
            }
            if (p.charAt(j - 1) == '.') {
                return true;
            }
            return s.charAt(i - 1) == p.charAt(j - 1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    淘宝H5接口获取app数据6.0格式
    【考研数学】九. 无穷级数
    CVE-2023-3836:大华智慧园区综合管理平台任意文件上传漏洞复现
    Hadoop和关系型数据库间的数据传输工具——Sqoop
    mvc core基于Asp Net的印刷网站
    【前端】弹球特效(重力模拟)
    一文1800字解读性能指标与性能分析
    网络工程师必背,OSPF中的一类LSA是什么
    使用Spark清洗统计业务数据并保存到数据库中
    用 GPL 开源后想转闭源,法院判决 GPL 协议终身有效;与 Log4j 漏洞斗争是场持久战;Firefox 96 发布 | 开源日报
  • 原文地址:https://blog.csdn.net/m0_58058653/article/details/125529091