动态规划实现正则递归匹配
动态规划在正则表达式匹配问题中能有效处理嵌套模式,尤其是涉及递归结构的匹配。以下是实现方法:
定义状态与转移方程
设 dp[i][j] 表示输入字符串 s 的前 i 个字符与模式 p 的前 j 个字符是否匹配。初始化 dp[0][0] = true,表示空字符串匹配空模式。
- 当
p[j-1] != '*'时: [ dp[i][j] = dp[i-1][j-1] \ \text{且} \ (s[i-1] == p[j-1] \ \text{或} \ p[j-1] == '.') ] - 当
p[j-1] == '*'时: [ dp[i][j] = dp[i][j-2] \ \text{(匹配0次)} \ \text{或} \ (dp[i-1][j] \ \text{且} \ (s[i-1] == p[j-2] \ \text{或} \ p[j-2] == '.')) ]
处理嵌套递归
对于嵌套模式如 (a*)*,需扩展状态定义。引入三维数组 dp[i][j][k],其中 k 表示嵌套深度。每次遇到开括号 ( 时增加深度,闭括号 ) 时减少深度,并在状态转移中考虑当前深度的匹配。
代码实现示例(Python)
def isMatch(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 i in range(m + 1):
for j in range(1, n + 1):
if p[j-1] == '*':
dp[i][j] = dp[i][j-2] or (i > 0 and dp[i-1][j] and (s[i-1] == p[j-2] or p[j-2] == '.'))
else:
dp[i][j] = i > 0 and dp[i-1][j-1] and (s[i-1] == p[j-1] or p[j-1] == '.')
return dp[m][n]
优化与边界处理
- 剪枝策略:提前终止无效状态的计算,如当
p剩余字符无法覆盖s的剩余长度时。 - 记忆化搜索:对于复杂嵌套模式,可采用递归+记忆化替代动态规划,减少状态数。
715

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



