剑指 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 };
参考#
分类:
剑指Offer(第2版)
标签:
动态规划
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 编写求任意二叉树中一条最长的路径的算法,要求输出此路径上各结点的值及路径的长度。