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

    问题描述

    给定一个字符串 (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"。
    

    示例 3:

    输入:
    s = "ab"
    p = ".*"
    输出: true
    解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
    

    示例 4:

    输入:
    s = "aab"
    p = "c*a*b"
    输出: true
    解释: 'c' 可以不被重复, 'a' 可以被重复一次。因此可以匹配字符串 "aab"。
    

    示例 5:

    输入:
    s = "mississippi"
    p = "mis*is*p*."
    输出: false
    

    解决方案

    class Solution(object):
        def isMatch(self, s, p):
            dp = [[False] * (len(s) + 1) for _ in range(len(p) + 1)]
            dp[0][0] = True
            for i in range(1, len(p)):
                dp[i + 1][0] = dp[i - 1][0] and p[i] == "*"
            for i in range(len(p)):
                for j in range(len(s)):
                    if p[i] == '*':
                        dp[i + 1][j + 1] = dp[i - 1][j + 1] or dp[i][j + 1]
                        if p[i - 1] == s[j] or p[i - 1] == '.':
                            dp[i + 1][j + 1] |= dp[i + 1][j]
                    else:
                        dp[i + 1][j + 1] = dp[i][j] and (p[i] == s[j] or p[i] == '.')
            return dp[-1][-1]
    
    
    def main(s, p):
        a = Solution()
        print(a.isMatch(s, p))
    
    
    if __name__ == '__main__':
        s = "aab"
        p = "aa."
        main(s, p
    
  • 相关阅读:
    J2EE系列 (一) 几个技术规范
    MyEclipse 10 优化技巧
    J2EE (二) Servlet设置Session Cookies
    CSS 外层box自动计算高度的问题
    UI设计技巧Div封闭式Div导致页面显示异常
    Windows 7 IIS7 无法启动, 显示WAS & W3SVC没有启动的错误提示
    Windows 7 截图
    GridView技巧增加序号列
    ERWin & ERStudio图里的实线和虚线的含义
    [转]CSS布局口诀 CSS BUG顺口溜
  • 原文地址:https://www.cnblogs.com/huang-yc/p/10356735.html
Copyright © 2011-2022 走看看