zoukankan      html  css  js  c++  java
  • leetcode_10

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    @href: https://leetcode.com/problems/regular-expression-matching/description/
    @title: Regular Expression Matching
    """
    
    
    class Token(object):
        def __init__(self, c, m):
            self.c = c
            self.m = m
            
        def __str__(self):
            return str(self.c, self.m)
    
        def mm(self):
            return  self.m 
        
        def eq(self, c):
            res = None
            if self.c == '.' or self.c == c:
                res = True
            else:
                res = False
            return res
    
    class Solution(object):
        def isMatch(self, s, p):
            """
            :type s: str
            :type p: str
            :rtype: bool
            """
            ls, lp = len(s), len(p)
            if (ls + lp) == 0:
                return True
        
            p1, lt = [], None
            
             
            s, p = 'a' + s, 'a' + p  # isMatch 不能匹配 'a', 'c*a',需要写的边界太复杂。不如这样改一下  
        
            for i in range(0, lp+1):
                if p[i] == '*':
                    lt.m = True
                else:
                    lt = Token(p[i], False)
                p1.append(lt)
    
            p = p1
            ls, lp = len(s), len(p)
            dp = [[False]*(lp+1) for i in range(0, ls+1)] 
            dp[0][0] = True
            for i in range(1, ls+1):
                for j in range(1, lp+1):
                    if p[j-1].eq(s[i-1]):
                        dp[i][j] = dp[i-1][j-1] # 普通情况
                        if p[j-1].mm():
                            dp[i][j] = dp[i][j] or dp[i-1][j] or dp[i][j-1] # 要考虑一个 x* 能匹配多个或一个都匹配不到的情况
                    else:
                        if p[j-1].mm():
                            dp[i][j] = dp[i][j-1] # 不匹配该 x* 的情况
            return dp[ls][lp]                 
    
        
    if __name__ == '__main__':
        a = Solution()
        print a.isMatch('aa', 'a')
        print a.isMatch('aa', 'aa')
        print a.isMatch('aaa', 'aa')
        print a.isMatch('aa', 'a*')
        print a.isMatch('aa', '.*')
        print a.isMatch('ab', '.*')
        print a.isMatch('aab', 'a*b*')    
        print a.isMatch('a', 'c*a')
    

      dp 题目的边界初始值还是很难考虑的, 如果我不用  s, p = 'a' + s, 'a' + p 来预处理一下。真不知道怎么写初始化值!

  • 相关阅读:
    关于类加载
    Java垃圾回收机制复习
    关于网络协议
    hadoop
    dubbo框架原理
    经典场景的设计方案整理
    报告撰写,linux使用gimp简单做gif动图
    《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---11
    《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---10
    《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---07
  • 原文地址:https://www.cnblogs.com/tmortred/p/8038685.html
Copyright © 2011-2022 走看看