zl程序教程

您现在的位置是:首页 >  前端

当前栏目

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

正则表达式 匹配 Offer 19
2023-09-11 14:19:00 时间

 

思路

方法一:递归

以下代码改成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 };

 

参考

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