【剑指offer】面试题19:正则表达式匹配(Java)
发布日期:2021-04-30 21:06:34 浏览次数:88 分类:精选文章

本文共 1795 字,大约阅读时间需要 5 分钟。

动态规划是一种有效的方法来解决文本匹配问题,尤其是当模式中包含特殊字符如 '.' 和 '*' 时。以下是实现该功能的详细步骤:

  • 初始化动态规划表格:创建一个二维数组 dp,其中 dp[i][j] 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配。

  • 填充边界条件:dp[0][0] 初始化为 true,因为空字符串与空字符串匹配。

  • 处理模式中的 '*':对于每个 '*',检查其前面的字符是否匹配,决定是否可以匹配当前字符。

  • 填充 dp 表格:遍历 s 和 p 的所有字符,根据当前字符和模式字符的情况更新 dp 表格。

  • 通过这种方法,可以准确地判断给定字符串是否与正则表达式完全匹配。以下是具体的代码实现:

    public class Solution {
    public boolean isMatch(String s, String p) {
    boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
    dp[0][0] = true;
    for (int j = 1; j <= p.length(); j++) {
    if (p.charAt(j - 1) == '*' && dp[0][j - 2]) {
    dp[0][j] = true;
    }
    }
    for (int i = 1; i <= s.length(); i++) {
    for (int j = 1; j <= p.length(); j++) {
    if (s.charAt(i - 1) == p.charAt(j - 1)) {
    dp[i][j] = dp[i - 1][j - 1];
    } else if (p.charAt(j - 1) == '.') {
    dp[i][j] = dp[i - 1][j - 1];
    } else if (p.charAt(j - 1) == '*' && j >= 2) {
    if (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.') {
    dp[i][j] = dp[i][j - 1] || dp[i][j - 2] || dp[i - 1][j];
    } else {
    dp[i][j] = dp[i][j - 2];
    }
    } else {
    dp[i][j] = dp[i][j - 2];
    }
    }
    }
    return dp[s.length()][p.length()];
    }
    }

    步骤解释:

    • 初始化:dp 表格的大小为 (s.length() + 1) x (p.length() + 1),dp[0][0] 设为 true。

    • 处理 '*' 的边界情况:当 j=1 时,检查 p[j-1] 是否为 '*',并查看 dp[0][j-2] 是否为 true,进而设置 dp[0][j] 为 true。

    • 填充 dp 表格:遍历每个字符,根据字符匹配情况更新 dp[i][j]。具体情况包括:

      • 当字符匹配时,dp[i][j] 取决于 dp[i-1][j-1]。
      • 当字符不匹配但为 '.' 时,dp[i][j] 取决于 dp[i-1][j-1]。
      • 当字符不匹配但为 '*' 时,检查前一个字符是否匹配,决定是否可以匹配多个。

    通过这种方法,可以有效地判断整个字符串是否与给定的正则表达式匹配。

    上一篇:Leetcode--397. 整数替换
    下一篇:Leetcode--837. 新21点(java)

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2026年05月29日 14时11分37秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章