Search code examples
pythonprintingreturnpython-re

Leetcode 10 - Regular Expresssion (regex) Matching Solution (in Python) not working on Leetcode Environment


10. Regular Expression Matching (HARD)

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

'.' Matches any single character.​​​​ '*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial).

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 preceding 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 = "cab" 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 = "misisp*." Output: false

Constraints:

1 <= s.length <= 20 1 <= p.length <= 30 s contains only lowercase English letters. p contains only lowercase English letters, '.', and ''. It is guaranteed for each appearance of the character '', there will be a previous valid character to match.

I came up with my solution which seems to work correctly on my local python environment, but doesn't work on the Leetcode environment

MY CODE (on my local Python interpreter):

import re

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

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

OUTPUT:

true

The Stubbed Code on Leetcode follows as given below and expects to return "true" or "false" based on the matching:

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

The same code when used in this above stub doesn't seem to work and prints only "true" for every test case :(. However, if I use the print statements in place of return, it produces the correct output. But, since the code requests/expects only return value, it marks my answer as wrong.

My Exact Code on 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"

leetcode solution with return statement

With the print statements, it produces correct output in "stdout" and not in "Output.

leetcode solution with print statement

Please help me with this problem. I don't know why Leetcode is not displaying the correct output when I use return statements. The test case used in the Leetcode environment is given below, where alternate lines represent "string" and "pattern" respectively:

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

Solution

  • Your function is supposed to return a boolean (-> bool) so you can directly return fullmatch:

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