【剑指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]。
- 当字符不匹配但为 '*' 时,检查前一个字符是否匹配,决定是否可以匹配多个。
通过这种方法,可以有效地判断整个字符串是否与给定的正则表达式匹配。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2026年05月29日 14时11分37秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!