classSolution(object): defisPalindrome(self, x): """ :type x: int :rtype: bool """ if x < 0: returnFalse ans = 0 pri = x while x != 0: ans = x%10 + ans*10 x //= 10 if ans == pri: returnTrue else: returnFalse
10. 正则表达式匹配(困难)
题目描述
给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。
1 2
'.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。
s可能为空,且只包含从a-z的小写字母。
p可能为空,且只包含从a-z的小写字母,以及字符.和*。
示例1:
1 2 3 4 5
输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。
示例2:
1 2 3 4 5
输入: s = "aa" p = "a*" 输出: true 解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例3:
1 2 3 4 5
输入: s = "ab" p = ".*" 输出: true 解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
示例4:
1 2 3 4 5
输入: s = "aab" p = "c*a*b" 输出: true 解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
示例5:
1 2 3 4
输入: s = "mississippi" p = "mis*is*p*." 输出: false
代码
解法1:暴力递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution(object): defisMatch(self, s, p): """ :type s: str :type p: str :rtype: bool """ iflen(p) == 0: returnnot s # 出现'.'的情况 first = bool(s) and p[0] in (s[0], '.') # 出现'*'的情况 iflen(p)>1and p[1]=='*': return self.isMatch(s, p[2:]) or (first and self.isMatch(s[1:], p)) else: return first and self.isMatch(s[1:], p[1:])
classSolution(object): defisMatch(self, s, p): """ :type s: str :type p: str :rtype: bool """ # 定义一个字典作为备忘录 memo = dict() defdp(i, j): # 避免重复计算 if (i,j) in memo: return memo[(i,j)] if j==len(p): return i==len(s) first = i<len(s) and p[j] in (s[i], '.') if j<len(p)-1and p[j+1] == '*': ans = dp(i,j+2) or first and dp(i+1,j) else: ans = first and dp(i+1,j+1) memo[(i,j)] = ans return ans return dp(0,0)