剑指 Offer(第2版)面试题 19:正则表达式匹配

剑指 Offer(第2版)面试题 19:正则表达式匹配

剑指 Offer(第2版)面试题 19:正则表达式匹配

题目来源:

  1. AcWing 30. 正则表达式匹配
  2. LeetCode 10. 正则表达式匹配

解法1:递归

代码:

class Solution
{
   
public:
    bool isMatch(string s, string p)
    {
   
        if (p.empty())
            return s.empty();
        return match(s, p, 0, 0);
    }
    bool match(string s, string p, int a, int b)
    {
   
        if (b == p.size())
            return a == s.size();
        else if (a == s.size())
        {
   
            if (b == p.size() - 1 || p[b + 1] != '*')
                return false;
            return match(s, p, a, b + 2);
        }
        if (b + 1 == p.size())
            return a + 1 == s.size() && (s[a] == p[b] || p[b] == '.');
        if (p[b + 1] != '*')
        {
   
            if (s[a] == p[b] || p[b] == '.')
                return match(s, p, a + 1, b + 1);
            return false;
        }
        if (s[a] != p[b] && p[b] != '.')
            return match(s, p, a, b + 2);
        return match(s, p, a, b + 2) || match(s, p, a + 1, b + 2) || match(s, p, a + 1, b);
    }
};

注:这种写法不能在 LeetCode 上通过,爆栈了。

解法2:动态规划

代码:

class Solution
{
   
public:
    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[i,j]: 表示以i截止的字符串是否可以被以j截止的正则表达式匹配
        //  初始化
        dp[0][0] = true;
        // 在匹配0次的情况下,浪费一个字符+星号的组合,没有匹配任何s中的字符
        for (int i = 1; i <= n; i++)
            if (p[i - 1] == '*') //'*'匹配零个或多个前面的那一个元素
                dp[0][i] = dp[0][i - 2];
        // 状态转移
        for (int i = 1; i <= m; i++)
            for (int j = 1; j <= n; j++)
            {
   
                if (p[j - 1] != '*') // 当前p匹配的字符不是'*'
                {
   
                    if (match(s[i - 1], p[j - 1]) == true) // 当前s匹配的字符和p匹配的字符相符合
                        dp[i][j] = dp[i - 1][j - 1];
                    else // 当前s匹配的字符和p匹配的字符不相符合,dp[i,j]=false
                        dp[i][j] = false;
                }
                else // 当前p匹配的字符为'*'
                {
   
                    // 当前s匹配的字符和p匹配的p中一个字符+星号的组合相匹配,
                    // 要么跳过一个字符+星号的组合,要么看dp[i-1][j]是否为true,或运算连接
                    if (match(s[i - 1], p[j - 2]) == true)
                        dp[i][j] = dp[i - 1][j] || dp[i][j - 2];
                    else // 当前s匹配的字符和p中一个字符+星号的组合不相匹配,跳过该组合
                        dp[i][j] = dp[i][j - 2];
                }
            }
        return dp[m][n];
    }
    // 辅函数
    bool match(char &sc, char &pc)
    {
   
        //'.'匹配任意单个字符,故一定匹配成功
        if (pc == '.')
            return true;
        // 不然看s字符和p字符是否相同
        return sc == pc;
    }
};

复杂度分析:

时间复杂度:O(m*n),其中 m 是字符串 s 的长度,n 是字符串 p 的长度。

空间复杂度:O(m*n),其中 m 是字符串 s 的长度,n 是字符串 p 的长度。

相关推荐

  1. Offer2版)面试题 19表达式匹配

    2023-12-07 15:46:08       65 阅读
  2. 30 offer-动态规划求表达式匹配

    2023-12-07 15:46:08       50 阅读
  3. LeetCode-10. 表达式匹配

    2023-12-07 15:46:08       61 阅读
  4. leetCode算法—10. 表达式匹配

    2023-12-07 15:46:08       71 阅读
  5. LeetCode_10_困难_表达式匹配

    2023-12-07 15:46:08       67 阅读
  6. 19表达式 - C++

    2023-12-07 15:46:08       60 阅读
  7. 匹配/表达式

    2023-12-07 15:46:08       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-07 15:46:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-07 15:46:08       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-07 15:46:08       82 阅读
  4. Python语言-面向对象

    2023-12-07 15:46:08       91 阅读

热门阅读

  1. 在Django中使用Q对象和条件运算符来构建动态查询

    2023-12-07 15:46:08       69 阅读
  2. Python环境管理利器-Anaconda介绍与安装

    2023-12-07 15:46:08       61 阅读
  3. Django 中的 HMAC 请求签名校验与 Vue.js 的完美协作

    2023-12-07 15:46:08       62 阅读
  4. AIGC: 关于ChatGPT中API接口调用相关准备工作

    2023-12-07 15:46:08       61 阅读
  5. git 修改 commit 未推送的信息

    2023-12-07 15:46:08       59 阅读
  6. KALI LINUX入门

    2023-12-07 15:46:08       47 阅读
  7. 代码规范及开发工具

    2023-12-07 15:46:08       69 阅读
  8. Linux虚假唤醒

    2023-12-07 15:46:08       62 阅读
  9. Python【走出棋盘】

    2023-12-07 15:46:08       50 阅读