正则匹配 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 初始化错误问题。
1725

被折叠的 条评论
为什么被折叠?



