caisense的专栏

诗和远方

10. Regular Expression Matching

https://leetcode.com/problems/regular-expression-matching/description/

题目大意:给一个字符串s和模式串p,求s是否匹配p
这里要注意的是“*”表示前面的字符可以重复0到无数次,并不是传统意义上的通配符。

解题思路1(递归):把x*(x为任意字符),当做一个整体,这是最难处理的部分,因为x可以重复0到无数次。
我们先来判断p是否为空,若为空则根据s的为空的情况返回结果。当p的第二个字符为*号时,由于*号前面的字符的个数可以任意,可以为0,那么我们先用递归来调用为0的情况,就是直接把这两个字符去掉再比较,或者当s不为空,且第一个字符和p的第一个字符相同时,我们再对去掉首字符的s和p调用递归,注意p不能去掉首字符,因为*号前面的字符可以有无限个;如果第二个字符不为*号,那么我们就老老实实的比较第一个字符,然后对后面的字符串调用递归

代码:

class Solution:
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        if not p:
            return not s
        #为了使代码简洁,第一位字符匹配的结果用first_match代替
        first_match = bool(s) and (s[0] == p[0] or p[0] == '.')

        if len(p) >= 2 and p[1] == '*':  #如果在p中检测到“x*”型字段
            return self.isMatch(s, p[2:]) or first_match and self.isMatch(s[1:], p)
        else:
            return first_match and self.isMatch(s[1:], p[1:])

解题思路2(DP):

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012033124/article/details/80317136
个人分类: LeetCode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

10. Regular Expression Matching

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭