LeetCode 10. Regular Expression

2018-11-21  本文已影响8人  费城的二鹏

10. Regular Expression Matching

递归匹配字符串,可以精简代码。据说可以用 dp 实现

class Solution:

    # a-z . A-Z &
    def recursion(self, s, si, p, pi):
        if len(s) == si and len(p) == pi:
            return True
        elif len(p) == pi:
            return False
        elif p[pi] >= 'a' and p[pi] <= 'z':
            if si < len(s) and s[si] == p[pi]:
                return self.recursion(s, si + 1, p, pi + 1)
            else:
                return False
        elif p[pi] == '.':
            return self.recursion(s, si + 1, p, pi + 1)
        elif p[pi] >= 'A' and p[pi] <= 'Z':
            result = self.recursion(s, si, p, pi + 1)
            if result:
                return True
            while si < len(s):
                if p[pi].lower() == s[si]:
                    si += 1
                    result = self.recursion(s, si, p, pi + 1)
                    if result:
                        return True
                else:
                    break
        elif p[pi] == '&':
            result = self.recursion(s, si, p, pi + 1)
            if result:
                return True
            while si < len(s):
                si += 1
                result = self.recursion(s, si, p, pi + 1)
                if result:
                    return True
                
        return False

    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        pr = p[::-1]
        pc = ""
        i = 0
        last = ''
        isAppend = True
        while i < len(pr):
            isAppend = True
            pp = pr[i]
            if pp >= 'a' and pp <= 'z':
                last = pp
            elif pp == '.':
                last = pp
            elif pp == '*':
                i += 1
                pp = pr[i] 
                if pp >= 'a' and pp <= 'z':
                    last = pp.upper()
                else:
                    last = '&'
            
            pc += last         
            i += 1
        
        # print(s)
        # print(p)
        p = pc[::-1]
        # print(p)

        result = self.recursion(s, 0, p, 0)
        print(result)
        return result

测试用例

import Solution

s = Solution.Solution()

s.isMatch("ab", ".*c") # False
s.isMatch("aa", "a") # False
s.isMatch("aa", "a*") 
s.isMatch("ab", ".*")
s.isMatch("aab", "c*a*b")
s.isMatch("mississippi", "mis*is*p*.") # False
s.isMatch("abaaac", ".*a*a*aa.c")
s.isMatch("aa", "a*")
s.isMatch("", "a*")
上一篇下一篇

猜你喜欢

热点阅读