leetcode 10. 正则表达式匹配

题目

leetcode 10. 正则表达式匹配
查看官方答案后才会的,但官方答案依然显得晦涩难懂,结合本人理解对该题解答进行介绍。

答题

首先分三种情况,字符为[字符,“”, “.”],s为目标字符串,p为正则匹配节点,根据p去对s进行匹配,动态规划首先考虑状态转移方程,借助f[i][j]表示s中的前i个字符与p中的前j个字符的匹配情况。
1. 若p[j]为字符,则状态转移方程为:
在这里插入图片描述
2. 若p[j]为".“,其可以匹配任意s中的字符。
3. 若p[j]为”
",则状态转移方程为:
在这里插入图片描述
综上所诉,得状态转移方程为:
在这里插入图片描述

代码如下

因为大部分编程语言中的字符串从0开始,我们的思路是从1开始,代码将考虑字符坐标问题

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        len_s, len_p = len(s), len(p)
        f = [[False]*(len_p+1) for _ in range(len_s+1)] #全坐标赋值为false
        f[0][0] = True # 空值相同为true
        
        def match(i, j):
            if i == 0:
                return False
            if p[j-1] == '.':
                return True
            return s[i-1] == p[j-1]
            
        for i in range(len_s+1): # 考虑坐标问题
            for j in range(1, len_p+1):
                if p[j-1] == "*":
                    f[i][j] = f[i][j-2]
                    if match(i,j-1):
                        f[i][j] |= f[i-1][j]
                else:
                    if match(i, j):
                        f[i][j] |= f[i-1][j-1]
        return f[len_s][len_p] 
                        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值