针对LeetCode中的正则表达式与通配符匹配问题,需结合动态规划(DP)思想解决。以下分两部分详细解析:
一、通配符匹配(LeetCode 44)
核心规则:模式p
中的?
匹配任意单个字符,*
匹配任意长度字符串(包括空串)。要求完全匹配。
动态规划解法步骤:
-
状态定义
定义二维数组dp[i][j]
,表示字符串s
的前i
个字符与模式p
的前j
个字符是否匹配。 -
初始化
dp[0][0] = True
:空字符串与空模式匹配。p
开头连续*
的情况:若p
前k
个字符均为*
,则dp[0][k] = True
,因为*
可匹配空串。
-
状态转移方程
- 当
p[j-1]
是?
或等于s[i-1]
:
dp[i][j] = dp[i-1][j-1]
(需前一步已匹配)。 - 当
p[j-1]
是*
:
*
可匹配空串(dp[i][j-1]
)或扩展匹配(dp[i-1][j]
),即:
dp[i][j] = dp[i][j-1] || dp[i-1][j]
。
- 当
-
填表顺序
双重循环按行或列填充均可,常见实现为逐行填充。 -
代码示例(C++):
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;
for (int j=1; j<=n && p[j-1]=='*'; ++j)
dp[0][j] = true;
for (int i=1; i<=m; ++i) {
for (int j=1; j<=n; ++j) {
if (p[j-1] == '?' || p[j-1] == s[i-1])
dp