Leetcode 10 - 正则表达式 (regex) 匹配解决方案 (in Python) 不适用于 Leetcode 环境
Leetcode 10 - Regular Expresssion (regex) Matching Solution (in Python) not working on Leetcode Environment
10。 Regular Expression Matching(难)
给定一个输入字符串 s 和一个模式 p,实现支持“.”的正则表达式匹配。和“*”,其中:
'.'匹配任何单个字符。
'*' 匹配零个或多个前面的元素。
匹配应该覆盖整个输入字符串(不是部分)。
示例 1:
输入:s = "aa", p = "a"
输出:错误
解释:“a”不匹配整个字符串“aa”。
示例 2:
输入:s = "aa", p = "a*"
输出:真
解释:'*'表示零个或多个前面的元素,'a'。因此,重复'a'一次,就变成了“aa”。
示例 3:
输入:s = "ab", p = "."
输出:真
解释:“.”表示“任意字符 (.) 的零个或多个 (*)”。
示例 4:
输入:s = "aab", p = "cab"
输出:真
解释:c可以重复0次,a可以重复1次。因此,它匹配“aab”。
示例 5:
输入:s = “mississippi”,p = “misisp*。”
输出:假
限制条件:
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 代码如下所示,并期望 return 基于匹配的“真”或“假”:
class Solution:
def isMatch(self, s: str, p: str) -> bool:
#code starts from here
在上面的存根中使用相同的代码似乎不起作用,并且只为每个测试用例打印“true”:(。但是,如果我使用打印语句代替 return,它产生正确的输出。但是,由于代码 requests/expects 只有 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"
使用 print 语句,它在“stdout”而不是“Output”中产生正确的输出。
请帮我解决这个问题。我不知道为什么 Leetcode 在我使用 return 语句时没有显示正确的输出。 Leetcode环境下使用的测试用例如下,其中隔行分别代表“string”和“pattern”:
"aa"
"a"
"aa"
"a*"
"ab"
".*"
"aab"
"c*a*b"
"mississippi"
"mis*is*p*."
你的函数应该 return 一个布尔值 (-> bool
) 所以你可以直接 return fullmatch
:
class Solution:
def isMatch(self, s: str, p: str) -> bool:
pattern = re.compile(rf"{p}")
return pattern.fullmatch(s)
10。 Regular Expression Matching(难)
给定一个输入字符串 s 和一个模式 p,实现支持“.”的正则表达式匹配。和“*”,其中:
'.'匹配任何单个字符。 '*' 匹配零个或多个前面的元素。 匹配应该覆盖整个输入字符串(不是部分)。
示例 1:
输入:s = "aa", p = "a" 输出:错误 解释:“a”不匹配整个字符串“aa”。
示例 2:
输入:s = "aa", p = "a*" 输出:真 解释:'*'表示零个或多个前面的元素,'a'。因此,重复'a'一次,就变成了“aa”。
示例 3:
输入:s = "ab", p = "." 输出:真 解释:“.”表示“任意字符 (.) 的零个或多个 (*)”。 示例 4:
输入:s = "aab", p = "cab" 输出:真 解释:c可以重复0次,a可以重复1次。因此,它匹配“aab”。
示例 5:
输入:s = “mississippi”,p = “misisp*。” 输出:假
限制条件:
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 代码如下所示,并期望 return 基于匹配的“真”或“假”:
class Solution:
def isMatch(self, s: str, p: str) -> bool:
#code starts from here
在上面的存根中使用相同的代码似乎不起作用,并且只为每个测试用例打印“true”:(。但是,如果我使用打印语句代替 return,它产生正确的输出。但是,由于代码 requests/expects 只有 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"
使用 print 语句,它在“stdout”而不是“Output”中产生正确的输出。
请帮我解决这个问题。我不知道为什么 Leetcode 在我使用 return 语句时没有显示正确的输出。 Leetcode环境下使用的测试用例如下,其中隔行分别代表“string”和“pattern”:
"aa"
"a"
"aa"
"a*"
"ab"
".*"
"aab"
"c*a*b"
"mississippi"
"mis*is*p*."
你的函数应该 return 一个布尔值 (-> bool
) 所以你可以直接 return fullmatch
:
class Solution:
def isMatch(self, s: str, p: str) -> bool:
pattern = re.compile(rf"{p}")
return pattern.fullmatch(s)