Leetcode Regular Expression Matching

题目:Regular Expression Matching

Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

Note:

  • s could be empty and contains only lowercase letters a-z.
  • p could be empty and contains only lowercase letters a-z, and characters like . or *.

Example 1:

Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".

Example 2:

Input:
s = "aa"
p = "a*"
Output: true
Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

Example 3:

Input:
s = "ab"
p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".

Example 4:

Input:
s = "aab"
p = "c*a*b"
Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".

Example 5:

Input:
s = "mississippi"
p = "mis*is*p*."
Output: false

解答:

刷题碰到了正则表达式匹配,之前牛客网做题时候做到过,本来以为同样的思路,结果并没有通过。

以下参考自Regular Expression Matching-sample 48 ms submission

class Solution:
    def isMatch(self, s, p):
        m, n = len(s), len(p)
        if n > 0 and p[0] == '*': return False
        
        s, p = s + '#' , p + '#'    # the hashtags mark the end of string/pattern

        prev = [False] * (m+1)
        current = [False] * (m+1)
        prev[-1] = True            # end of pattern matches end of string

        for i in range(n-1,-1,-1):
            if True not in prev: return False     # terminate early
            if p[i] == '*': continue         # ignore * and move to next char in pattern

            elif p[i] != '.' and p[i+1] == '*':
                current[-1] = prev[-1]
                for j in range(m-1,-1,-1):
                    current[j] =  prev[j] or (p[i] == s[j] and current[j+1]) 

            elif p[i] == '.' and p[i+1] == '*':
                current[-1] = prev[-1]
                for j in range(m-1,-1,-1):
                    current[j] = current[j+1] or prev[j]
            elif p[i] == '.':
                for j in range(m-1,-1,-1):
                    current[j] = prev[j+1]
            else:
                for j in range(m-1,-1,-1):
                    current[j] = prev[j+1] and p[i] == s[j]

            prev = current
            current = [False] * (m+1)

        return prev[0] 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏函数式编程语言及工具

Scalaz(12)- Monad:再述述flatMap,顺便了解MonadPlus

  在前面的几篇讨论里我们初步对FP有了些少了解:FP嘛,不就是F[A]吗?也是,FP就是在F[]壳子(context)内对程序的状态进行更改,也就是在F壳子(...

20570
来自专栏互联网开发者交流社区

Java逻辑

15940
来自专栏菜鸟前端工程师

JavaScript学习笔记023-对象方法0包装对象0静态属性

11120
来自专栏散尽浮华

Python-面向对象编程

概述: 面向过程:根据业务逻辑从上到下写代码。 函数式:将某功能代码封装到函数中,以后便无需重复编写,进调用函数即可。 面向对象:对函数进行分类和封装,让开发“...

22670
来自专栏blackheart的专栏

[C#3] 1-扩展方法

1.从DEMO开始 先看一个扩展方法的例子: 1 class Program 2 { 3 public static void Main(...

224100
来自专栏偏前端工程师的驿站

JS魔法堂:再识Number type

Brief                                   本来只打算理解JS中0.1 + 0.2 == 0.300000000000000...

23950
来自专栏Spark学习技巧

一文详解scala泛型及类型限定

今天知识星球球友,微信问浪尖了一个spark源码阅读中的类型限定问题。这个在spark源码很多处出现,所以今天浪尖就整理一下scala类型限定的内容。希望对大家...

23220
来自专栏一个会写诗的程序员的博客

函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数.md

For example, in Lisp the 'square' function can be expressed as a lambda expressi...

8520
来自专栏mathor

ST算法

 RMQ(Range Minimum/Maximum Query),即区间最值查询。对于长度为n的数列arr,回答若干询问Q(i,j),返回数列arr中下标在i...

23820
来自专栏和蔼的张星的图像处理专栏

408. 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示) 样例 a = 11 b = 1 返回 100 非常惭愧还不是自己想来的算法,注意到几点: 1.数...

19220

扫码关注云+社区

领取腾讯云代金券