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 来预处理一下。真不知道怎么写初始化值!

posted @ 2017-12-14 17:07  tmortred  阅读(118)  评论(0编辑  收藏  举报