首页 > 解决方案 > Leetcode 10 - 正则表达式(regex)匹配解决方案(在 Python 中)不适用于 Leetcode 环境

问题描述

10.正则表达式匹配(HARD)

给定一个输入字符串 s 和一个模式 p,实现支持 '.' 的正则表达式匹配。和 '*' 其中:

'。' 匹配任何单个字符。​​​​ '*' 匹配零个或多个前面的元素。匹配应覆盖整个输入字符串(不是部分)。

示例 1:

输入:s = "aa", p = "a" 输出:false 解释:"a" 不匹配整个字符串 "aa"。

示例 2:

输入:s = "aa", p = "a*" 输出:true 解释:'*' 表示前面的元素 'a' 的零个或多个。因此,通过重复一次“a”,它就变成了“aa”。

示例 3:

输入:s = "ab", p = ". " 输出:true 解释:". " 表示“零个或多个 (*) 任意字符 (.)”。示例 4:

输入:s = "aab", p = "c a b" 输出:true 解释:c 可以重复 0 次,a 可以重复 1 次。因此,它匹配“aab”。

示例 5:

输入:s = "mississippi", p = "mis is p*." 输出:假

约束:

1 <= s.length <= 20 1 <= p.length <= 30 s 只包含小写英文字母。p 仅包含小写英文字母“.”和“ ”。保证每次出现字符“ ”,都会有一个先前的有效字符来匹配。

我想出了我的解决方案,它似乎在我的本地 python 环境中正常工作,但在 Leetcode 环境中不起作用

我的代码(在我本地的 Python 解释器上):

import re

p = "m.*m"
s = "madam"

p = r"{}".format(p)
p = re.compile(p)
if p.fullmatch(s):
    print("true")
else:
    print("false")

输出:

true

Leetcode 上的 Stubbed Code 如下所示,并期望根据匹配返回“true”或“false”:

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
    #code starts from here

在上面的存根中使用相同的代码似乎不起作用,并且只为每个测试用例打印“true”:(。但是,如果我使用打印语句代替 return,它会产生正确的输出。但是,因为代码只请求/期望返回值,它将我的答案标记为错误。

我在 LeetCode 上的确切代码:

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        p = r"{}".format(p)
        p = re.compile(p)
        if p.fullmatch(s):
            return "true"
        else:
            return "false"

带有return语句的leetcode解决方案

使用 print 语句,它会在“stdout”中产生正确的输出,而不是在“Output.

带有打印语句的leetcode解决方案

请帮我解决这个问题。我不知道为什么当我使用 return 语句时 Leetcode 没有显示正确的输出。下面给出 Leetcode 环境中使用的测试用例,其中交替的行分别代表“字符串”和“模式”:

"aa"
"a"
"aa"
"a*"
"ab"
".*"
"aab"
"c*a*b"
"mississippi"
"mis*is*p*."

标签: pythonprintingreturnre

解决方案


您的函数应该返回一个布尔值 ( -> bool),因此您可以直接返回fullmatch

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        pattern = re.compile(rf"{p}")
        return pattern.fullmatch(s)

推荐阅读