zoukankan      html  css  js  c++  java
  • 剑指 Offer 19. 正则表达式匹配

    思路

    方法一:递归

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

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

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

     1 bool matchCore(const char* str, const char* pattern)
     2 {
     3     if(*str == '' && *pattern == '')
     4         return true;
     5 
     6     if(*str != '' && *pattern == '')
     7         return false;
     8 
     9     if(*(pattern + 1) == '*')
    10     {
    11         if(*pattern == *str || (*pattern == '.' && *str != ''))
    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 != ''))
    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 };

    参考

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

  • 相关阅读:
    Python深浅拷贝&垃圾回收&with语句
    面向对象
    三器(装饰器,生成器,迭代器)
    Redis数据类型&优缺点&持久化方式
    localStroge和sessionStorge
    redis哨兵&codis
    Redis分布式锁
    技术点剖析
    【牛客网】牛客练习赛4 A Laptop【树状数组+离散化】
    组合数有关的公式及常用求和【数学--排列组合】
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/13987042.html
Copyright © 2011-2022 走看看