正则匹配 DP 初始化错误:初始状态设置问题解决

正则匹配 DP 初始化错误解决方法

动态规划(DP)在正则匹配问题中的初始化是关键步骤,错误的初始状态会导致整个算法失效。以下是常见问题及解决方案。

检查边界条件

初始化时需正确处理空字符串和空模式的情况。空字符串与空模式通常匹配成功,因此 dp[0][0] 应设为 True。空字符串与非空模式可能匹配,例如模式 a* 可以匹配空字符串(通过忽略 a*)。

处理通配符的初始状态

若模式以 * 开头,需确保初始状态正确处理。例如模式 *a 是无效的,但 a* 有效。初始化时应跳过连续的 * 或验证模式的合法性。

填充初始行和列
  • 首行初始化dp[0][j] 表示空字符串与模式的前 j 个字符是否匹配。若模式第 j 个字符是 *,则 dp[0][j] 的值可能与 dp[0][j-2] 相同(忽略前一个字符和 *)。
  • 首列初始化dp[i][0] 表示非空字符串与空模式的匹配情况,通常为 False(除非字符串也为空)。
示例代码
def is_match(s: str, p: str) -> bool:
    m, n = len(s), len(p)
    dp = [[False] * (n + 1) for _ in range(m + 1)]
    dp[0][0] = True  # 空字符串与空模式匹配

    # 处理首行(空字符串与非空模式)
    for j in range(1, n + 1):
        if p[j - 1] == '*':
            dp[0][j] = dp[0][j - 2]

    # 填充其余部分
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if p[j - 1] == '.' or p[j - 1] == s[i - 1]:
                dp[i][j] = dp[i - 1][j - 1]
            elif p[j - 1] == '*':
                dp[i][j] = dp[i][j - 2]  # 忽略前一个字符和 *
                if p[j - 2] == '.' or p[j - 2] == s[i - 1]:
                    dp[i][j] |= dp[i - 1][j]  # 匹配一个或多个字符
    return dp[m][n]

验证初始状态逻辑

编写单元测试验证初始化是否正确。例如:

  • 空字符串与 a* 应返回 True
  • a 与空模式应返回 False
  • 连续 * 应被视为非法或正确处理。

通过以上方法可有效解决正则匹配 DP 初始化错误问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值