剑指 Offer 19. 正则表达式匹配

 

思路#

方法一:递归#

以下代码改成c++中string的写法,提交到C++中会超时,可能string比指针更慢吧。

以下C语言代码参考《剑指offer(第2版)》书中的代码,可以在leetcode中提交通过。

这种递归方法效率比较低下。

复制代码
 1 bool matchCore(const char* str, const char* pattern)
 2 {
 3     if(*str == '\0' && *pattern == '\0')
 4         return true;
 5 
 6     if(*str != '\0' && *pattern == '\0')
 7         return false;
 8 
 9     if(*(pattern + 1) == '*')
10     {
11         if(*pattern == *str || (*pattern == '.' && *str != '\0'))
12             // '*'不重复
13             return matchCore(str + 1, pattern + 2)
14             // '*'继续重复
15             || matchCore(str + 1, pattern)
16             // '*'重复0次 
17             || matchCore(str, pattern + 2);
18         else
19             // '*'重复0次
20             return matchCore(str, pattern + 2);
21     } else if(*str == *pattern || (*pattern == '.' && *str != '\0'))
22         return matchCore(str + 1, pattern + 1);
23 
24     return false;
25 }
26 
27 bool isMatch(char* s, char* p){
28     if(s == NULL || p == NULL)
29         return false;
30 
31     return matchCore(s, p);
32 }
复制代码

 

方法二:动态规划#

 

 

复制代码
 1 class Solution {
 2 public:
 3     bool isMatch(string s, string p) {
 4         int m = s.size();
 5         int n = p.size();
 6 
 7         vector<vector<bool>> f(m + 1, vector<bool>(n + 1));
 8         f[0][0] = true;
 9         for (int i = 0; i <= m; ++i) {
10             for (int j = 1; j <= n; ++j) {
11                 if (p[j - 1] == '*') {
12                     f[i][j] = f[i][j - 2];
13                     if (matches(s, p, i, j - 1)) {
14                         f[i][j] = f[i][j] || f[i - 1][j];
15                     }
16                 }
17                 else {
18                     if (matches(s, p, i, j)) {
19                         f[i][j] = f[i - 1][j - 1];
20                     }
21                 }
22             }
23         }
24         return f[m][n];
25     }
26 
27     //注意i,j与下标之间的对应关系
28     bool matches(string &s, string &p, int i, int j) {
29         if (i == 0) {
30             return false;
31         }
32         if (p[j - 1] == '.') {
33             return true;
34         }
35         return s[i - 1] == p[j - 1];
36     };
37 };
复制代码

 

参考#

力扣官方题解 - 正则表达式匹配

posted @   拾月凄辰  阅读(63)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2019-11-16 在Linux下使用gcc运行C语言程序
2018-11-16 编写求任意二叉树中一条最长的路径的算法,要求输出此路径上各结点的值及路径的长度。
点击右上角即可分享
微信分享提示
主题色彩