算法学习打卡计划

leetcode第十题 —— 正则表达式匹配

2019-11-13  本文已影响0人  不分享的知识毫无意义

1.题目

原题

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。

例子

1.输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
2.输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。

2.解析

这道题是一道正则题,要求的是完全匹配而非部分匹配,思路有三种。

3.python代码

3.1 正则包

import re
class Solution():
    def isMatch(self, p, s):
        return re.match('^'+s+'$', p) is not None

3.2 递归求解

class Solution():
    def isMatch(self, p, s):
        #最简单的情况,s为空
        if not s:
            return not p
        firstmatch = bool(p) and (s[0] == '.' or s[0] == p[0])
        if len(s) > 1 and s[1] == '*':
            return (self.isMatch(p, s[2:]) or
                    firstmatch and self.isMatch(p[1:], s))
        else:
            return firstmatch and self.isMatch(p[1:], s[1:])

3.3 动态规划求解

class Solution():
    def isMatch(self, p, s):
        dp = [[False for _ in range(len(s) + 1)] for _ in range(len(p) + 1)]
        dp[0][0] = True
        for j in range(2, len(s) + 1):
            if s[j-1] == '*':
                dp[0][j] = dp[0][j-2]
        for i in range(1, len(p) + 1):
            for j in range(1, len(s) + 1):
                if s[j - 1] == p[i-1] or s[j-1] == '.':
                    dp[i][j] = dp[i-1][j-1]
                if s[j - 1] == '*':
                    dp[i][j] = dp[i][j-1] or dp[i][j-2] or dp[i-1][j] and (s[j - 2] == '.' or s[j - 2] == p[i - 1])
        return dp[len(p)][len(s)]
上一篇下一篇

猜你喜欢

热点阅读