LeetCode中的正则表达式和通配符匹配问题

针对LeetCode中的正则表达式与通配符匹配问题,需结合动态规划(DP)思想解决。以下分两部分详细解析:


一、通配符匹配(LeetCode 44)

核心规则:模式p中的?匹配任意单个字符,*匹配任意长度字符串(包括空串)。要求完全匹配。

动态规划解法步骤
  1. 状态定义
    定义二维数组dp[i][j],表示字符串s的前i个字符与模式p的前j个字符是否匹配。

  2. 初始化

    • dp[0][0] = True:空字符串与空模式匹配。
    • p开头连续*的情况:若pk个字符均为*,则dp[0][k] = True,因为*可匹配空串。
  3. 状态转移方程

    • 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]
  4. 填表顺序
    双重循环按行或列填充均可,常见实现为逐行填充。

  5. 代码示例(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百态老人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值