zoukankan      html  css  js  c++  java
  • [LeetCode] 10. 正则表达式匹配

    题目链接:https://leetcode-cn.com/problems/regular-expression-matching/

    题目描述:

    给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.''*' 的正则表达式匹配。

    '.' 匹配任意单个字符。
    '*' 匹配零个或多个前面的元素。
    

    匹配应该覆盖整个字符串 (s) ,而不是部分字符串。

    说明:

    • s 可能为空,且只包含从 a-z 的小写字母。
    • p 可能为空,且只包含从 a-z 的小写字母,以及字符 .*

    示例:

    示例 1:

    输入:
    s = "aa"
    p = "a"
    输出: false
    解释: "a" 无法匹配 "aa" 整个字符串。
    

    示例 2:

    输入:
    s = "aa"
    p = "a*"
    输出: true
    解释: '*' 代表可匹配零个或多个前面的元素, 即可以匹配 'a' 。因此, 重复 'a' 一次, 字符串可变为 "aa"。
    

    思路:

    动态规划

    直接上动态方程:

    1. p[j] == s[i]:dp[i][j] = dp[i-1][j-1]

    2. p[j] == ".":dp[i][j] = dp[i-1][j-1]

    3. p[j] =="*":

      3.1 p[j-1] != s[i]:dp[i][j] = dp[i][j-2]

      3.2 p[i-1] == s[i] or p[i-1] == ".":

      dp[i][j] = dp[i-1][j] // 多个a的情况

      or dp[i][j] = dp[i][j-1] // 单个a的情况

      or dp[i][j] = dp[i][j-2] // 没有a的情况

    代码:

    class Solution:
        def isMatch(self, s: str, p: str) -> bool:
            #if not s or not p:
                #return False
            s_len = len(s)
            p_len = len(p)
            dp = [[False] * (p_len + 1) for _ in range(s_len + 1)]
            #print(dp)
            dp[0][0] = True
            for i in range(p_len):
                if p[i] == "*" and dp[0][i - 1]:
                    dp[0][i + 1] = True
            #print(dp)
            for i in range(s_len):
                for j in range(p_len):
                    if p[j] == s[i] or p[j] == ".":
                        dp[i + 1][j + 1] = dp[i][j]
                    elif p[j] == "*":
                        if p[j - 1] != s[i]:
                            dp[i + 1][j + 1] = dp[i + 1][j - 1]
                        if p[j-1] == s[i] or p[j-1] == ".":
                            dp[i+1][j+1] = (dp[i][j+1] or dp[i+1][j]   or  dp[i+1][j-1])
            #print(dp)
            return dp[-1][-1]
    
  • 相关阅读:
    APP Https双向认证抓包
    剖析XSS
    php连接mysql
    linux去掉某一字符开头的行
    memcached+php客户端
    memcached-repcached
    memcached+memadmin
    Linux GPT分区
    Linux查看文件夹大小
    linux挂载windwos共享文件
  • 原文地址:https://www.cnblogs.com/powercai/p/10736890.html
Copyright © 2011-2022 走看看