zoukankan      html  css  js  c++  java
  • LeetCode 正则表达式匹配

    题目链接:https://leetcode-cn.com/problems/regular-expression-matching/

    题目大意:

      略。

    分析:

      这道题左神书上的解法不是最优的, 时间复杂度最优可以到O(NM)。
      请参见LeetCode官方题解.

    代码如下:

     1 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i)
     2 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i)
     3 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i)
     4 #define ms0(a) memset(a,0,sizeof(a))
     5 
     6 class Solution {
     7 public:
     8     bool isMatch(string s, string p) {
     9         int N = s.size(), M = p.size();
    10         // dp[i][j] 表示s[0~i-1]和p[0~j-1]是否匹配 
    11         bool dp[N + 2][M + 2];
    12         ms0(dp);
    13 
    14         dp[0][0] = 1; // 有 0 的代表空串,第0列其余必定为0 
    15         if(p[0] == '.' || p[0] == s[0]) dp[1][1] = 1; // 第1列其余必为0 
    16 
    17         For(j, 2, M) {
    18             For(i, 0, N) {
    19                 if(p[j - 1] != '*') {
    20                     dp[i][j] = i && dp[i - 1][j - 1] && (p[j - 1] == '.' || s[i - 1] == p[j - 1]);
    21                 }
    22                 else {
    23                     if(dp[i][j - 2]) dp[i][j] = dp[i][j - 2]; // p[j - 2]出现0次的情况
    24                     else {// p[j - 2]出现0次以上的情况
    25                         dp[i][j] = i && dp[i - 1][j] && (p[j - 2] == '.' || s[i - 1] == p[j - 2]);
    26                     } 
    27                 }
    28             }
    29         } 
    30         
    31         return dp[N][M];
    32     }
    33 };
    View Code
  • 相关阅读:
    枚举
    交房租
    Schtasks 命令详解
    记录自己在 cmd 中执行 jar 文件遇到的一些错误
    Java 8 日期时间 API
    Java 8 Optional 类
    Java 8 Stream
    Java 8 默认方法
    Java 8 函数式接口
    Java 8 方法引用
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/11454394.html
Copyright © 2011-2022 走看看