python写算法题:leetcode: 44. Wildcard Matching

115 篇文章 0 订阅
class Solution(object):
    def fullMatch(self, s, p):
        if len(s)!=len(p): return False
        for i in xrange(len(s)):
            if s[i]!=p[i] and p[i]!='?':
                return False
        return True
    
    def endMatch(self, s, p):
        if len(s)>len(p):
            remain=s[:len(s)-len(p)]
        else:
            remain=""
        return remain, self.fullMatch(s[len(s)-len(p):], p)

    def startMatch(self, s, p):
        if len(s)>len(p):
            remain=s[:len(p)]
        else:
            remain=""
        remain=s[len(p):]
        return remain, self.fullMatch(s[:len(p)], p)
    
    def contain(self, s, p):
        pos=s.find(p)
        if pos>=0:
            remain=s[pos+len(p):]
            return remain, pos>=0
        else:
            return "", False
    
    def contains(self, s, ps):
        for p in ps:
            subps = p.split('?')
            if len(subps)>1:
                while True:
                    if len(s)<len(subps[0])+1:
                        return False
                    if len(subps[0])>0:
                        s1, ret=self.contain(s, subps[0])
                        if ret and len(s1)>0:
                            s1=s1[1:]
                        else:
                            ret = False
                    else:
                        s1, ret=s[1:], True
                    if ret:
                        for subp in subps[1:-1]:
                            if len(s1)<len(subp)+1:
                                ret=False
                                break
                            if len(subp)>0:
                                s1, ret=self.startMatch(s1[1:],subp)
                            else:
                                s1, ret=s1[1:], True
                            if not ret: 
                                break
                            
                    if ret:
                        s1, ret=self.startMatch(s1,subps[-1])
                    if ret: 
                        s=s1
                        break
                    pos=s.find(subps[0])
                    if pos==-1:
                        return False
                    s=s[pos+1:]
            else:
                pos=s.find(p)
                if pos>=0:
                    s=s[pos+len(p):]
                else:
                    return False
        return True
        
    def isMatch(self, s, p):
        subp=p.split('*')
        if len(subp) == 1: 
            return self.fullMatch(s,p)
        if subp[0]>0:
            s, ret = self.startMatch(s, subp[0])
            if not ret: 
                return False
        if subp[-1]>0:
            s, ret = self.endMatch(s, subp[-1])
            if not ret: 
                return False
        if len(subp)>2:
            return self.contains(s,subp[1:len(subp)-1])
        return True

吐血,教科书上的三行递归写法不好使,只能把递归展开成不同case处理,各种判断借助测试用例一点点改对的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值