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 };

    参考

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

  • 相关阅读:
    常用加密解密类(含3des)
    谷歌API(Ajax)
    flashpaper使用详解
    布置小窝
    CodeSimth数据访问层模板
    CodeSmith业务逻辑层模板
    CodeSimth生成实体类模板
    C# 参考之方法参数关键字:params、ref及out
    ALV 格式常用参数
    BOM输出
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/13987042.html
Copyright © 2011-2022 走看看