LeetCode 热题 HOT 100(05,正则表达式匹配) (6)

我们需要对dp数组进行初始化,不如通过如下方式将内部所有元素初始化为False:,且dp[0][0]=True,因为空字符s自然能用空字符p来进行匹配:

dp = [[False] * (p_len + 1) for temp in range(s_len + 1)]; dp[0][0] = True

随后,需要将dp第一行进行额外处理,也就是初始状态的定义。这里的有个条件来对*进行判断,假如说*前面的一个字符存在,则需要将该位置上的dp值定义为与前两个值相同,因为在正则表达式中,*表示的是能匹配零个或多个前面的那一个元素(注意:这是在第一行进行定义,也就是说此时s可以看做""空字符,通过p[:j]正则来对其进行匹配):

for one_row_item in range(p_len):
    if p[one_row_item] == '*' and dp[0][one_row_item - 1]:
        dp[0][one_row_item + 1] = True

第一行处理完成,随后就需要对其他行的dp值进行填充,而填充的依据就是根据上一行来进行分类判断:假设遍历条件满足:p[j - 1] == s[i - 1] or p[j - 1] == '.',也就是说s和p对应的字符相同,或能通过.匹配任意字符,则将设置dp[i][j] = dp[i - 1][j - 1],因为此时dp[i][j]的匹配情况是由dp[i-1][j-1]来决定的;假如说此时的正则字符为*,则dp[i][j]需要根据dp[i][j - 2]、dp[i][j - 1]、dp[i - 1][j]共同决定,完整算法思想如下:

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        s_len, p_len = len(s), len(p)
        dp = [[False] * (p_len + 1) for temp in range(s_len + 1)]; dp[0][0] = True
        for one_row_item in range(p_len):
            if p[one_row_item] == '*' and dp[0][one_row_item - 1]:
                dp[0][one_row_item + 1] = True
        for i in range(1, s_len + 1):
            for j in range(1, p_len + 1):
                if p[j - 1] == s[i - 1] or p[j - 1] == '.': dp[i][j] = dp[i - 1][j - 1]
                elif p[j - 1] == '*':
                    if p[j - 2] != s[i - 1]: dp[i][j] = dp[i][j - 2]
                    if p[j - 2] == s[i - 1] or p[j - 2] == '.':
                        dp[i][j] = dp[i][j - 2] or dp[i][j - 1] or dp[i - 1][j]
        return dp[s_len][p_len]

总的来说,这道题还是有难度的,至少是目前刷到最难的一题了,也是花费了不少时间来理解,理解了也很难通过文字来进行描述,主要还是要通过阅读算法代码来理解其核心思想。

像这种通过动态规划算法来解决的问题还是要多做多练,才能孰能生巧。

我是Taoye,爱专研,爱分享,热衷于各种技术,学习之余喜欢下象棋、听音乐、聊动漫,希望借此一亩三分地记录自己的成长过程以及生活点滴,也希望能结实更多志同道合的圈内朋友,更多内容欢迎来访微信公主号:玩世不恭的Coder

推荐阅读:





参考资料:

[1] LeetCode官方:https://leetcode-cn.com/problems/regular-expression-matching/solution/zheng-ze-biao-da-shi-pi-pei-by-leetcode-solution/
[2] 动态规划算法:https://www.bilibili.com/video/BV1xb411e7ww?from=search&seid=9800329040911246241

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjzpg.html