1. 正则表达式匹配问题解析
正则表达式匹配是算法面试中的经典难题,也是实际开发中经常遇到的核心功能。这道题目要求我们实现一个简化版的正则表达式匹配功能,支持"."和"*"两种特殊字符的匹配规则。
1.1 题目理解与需求分析
题目给定一个字符串s和一个模式串p,要求判断s是否能够被p匹配。其中:
- "."可以匹配任意单个字符
- "*"表示前面的字符可以出现零次或多次
例如输入s="aab",p="cab"时,输出true。因为"c*"可以匹配零个c,"a*"可以匹配两个a,最后的"b"直接匹配。
这个问题的难点在于"*"的处理,因为它可以匹配零次或多次,这使得我们需要考虑多种可能的匹配方式。在实际面试中,面试官通常会考察候选人能否清晰地分析问题并设计出高效的解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态规划解法详解
2.1 动态规划思路建立
我们使用二维数组dp来记录匹配状态,其中dp[i][j]表示s的前i个字符和p的前j个字符是否匹配。这种定义方式在字符串匹配问题中非常常见。
初始化时:
- dp[0][0] = true:两个空字符串匹配
- 处理p可以匹配空字符串的情况(如"ab"可以匹配空字符串)
2.2 状态转移方程分析
状态转移分为两种情况:
-
当p[j-1]不是"*"时:
- 前i-1和j-1个字符必须匹配
- 当前字符必须匹配(相等或p[j-1]是".")
-
当p[j-1]是"*"时:
- 可以选择匹配0个前面的字符(跳过"*"和它前面的字符)
- 或者匹配至少1个前面的字符(如果前面的字符匹配)
2.3 代码实现细节
cpp复制bool isMatch(string s, string p) {
int m = s.size(), n = p.size();
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
dp[0][0] = true;
// 处理p可以匹配空字符串的情况
for (int j = 1; j <= n; ++j) {
if (p[j - 1] == '*') {
dp[0]
