python | LeetCode笔记 | 看了就头疼的题目


1. 正则表达式

这个题目复杂的原因之一,我觉得就是,即使不让你来实现,就是理解正则表达式,也不是那么容易,各种情况太多了,比如 “两个*连着”的情况合法不?题目里也没说,得自己去搜一些资料。

1.1 别人的解答

官网题解中有个不愿意透露姓名的大神写的,5行代码搞定。
在这里插入图片描述

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        if not p: return not s  # 结束条件:p为空,此时如果s为空,则true,否则为false

        first_match = (len(s) > 0) and p[0] in {s[0], '.'}  # 两个字符串,最开始的部分是否匹配
        # p的第二个字符为 “*” ,暗含第一个不能为 “*”
        if len(p) >=2 and p[1] == '*':
            # 匹配0个 | 多个
            return self.isMatch(s, p[2:]) or (first_match and self.isMatch(s[1:], p))
        ## p的第二个字符不是 “*”
        # 处理 `.` ,匹配一个
        return first_match and self.isMatch(s[1:], p[1:])

作者:dz-lee
链接:https://leetcode-cn.com/problems/regular-expression-matching/solution/jian-ming-qing-xi-xie-fa-python3xiang-xi-zhu-shi-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.2 自己的解答

我都忘了是我自己写出来的(我印象中就是把各种情况挨个都考虑到,没有别的高级操作)还是从哪里抄的,不论是哪一种,我自己也不想看,LeetCode超过30行的答案就感觉一个字——不想看!

在这里插入图片描述

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        def f_1(a_,b_):
            a_=""
            if len(b_)==1:
                return(False)
            else:
                for i in range(len(b_)):
                    if b_[i]!='*':
                        if i+1<len(b_):
                            if b_[i+1]!='*':
                                return(False)
                        else:
                            return(False)
                return(True)

        if s=="" and p=="":
            return(True)
        elif s!="" and p=="":
            return(False)
        elif s=="" and p!="":
            return(f_1("",p))
        else:
            l_s=len(s)+1
            l_p=len(p)+1
            matrix=[]
            for i in range(l_s):
                temp_list=[]
                for j in range(l_p):
                    temp_list.append(False)
                matrix.append(temp_list)
            #matrix=[[False]*l_p]*l_s
            matrix[0][0]=True
            for j in range(1,l_p):
                matrix[0][j]=f_1("",p[:j])
            for i in range(1,l_s):
                s_i=s[:i]
                for j in range(1,l_p):
                    p_j=p[:j]
                    if p_j[-1]=="*":
                        if p_j[-2]==s_i[-1]:
                            if matrix[i][j-1] or matrix[i][j-2]:
                                matrix[i][j]=True
                                continue
                            temp_i=i-1
                            while temp_i>=0 and s_i[temp_i-1]==s_i[i-1]:
                                if matrix[temp_i][j-1] or matrix[temp_i][j-2]:
                                    matrix[i][j]=True
                                    break
                                temp_i=temp_i-1
                            if temp_i>=0 and s_i[temp_i]!=s_i[i-1]:
                                matrix[i][j]=matrix[temp_i][j-1] or matrix[temp_i][j-2]
                        elif p_j[-2]=='.':
                            for k in range(i,-1,-1):
                                if matrix[k][j-1] or matrix[k][j-2]:
                                    matrix[i][j]=True
                                    break
                        else:
                            matrix[i][j]=matrix[i][j-2]
                    elif p_j[-1]=='.' or p_j[-1]==s_i[-1]:
                        matrix[i][j]=matrix[i-1][j-1]
                    else:
                        pass
            return(matrix[-1][-1])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值