44. 通配符匹配

44. 通配符匹配

难度
困难

297

给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘’ 的通配符匹配。
‘?’ 可以匹配任何单个字符。
'
’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和
示例 1:
输入:
s = “aa”
p = “a”
输出: false
解释: “a” 无法匹配 “aa” 整个字符串。
示例 2:
输入:
s = “aa”
p = "
"
输出: true
解释: ‘’ 可以匹配任意字符串。
示例 3:
输入:
s = “cb”
p = “?a”
输出: false
解释: ‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。
示例 4:
输入:
s = “adceb”
p = “ab”
输出: true
解释: 第一个 '
’ 可以匹配空字符串, 第二个 '’ 可以匹配字符串 “dce”.
示例 5:
输入:
s = “acdcb”
p = "a
c?b"
输入: false

递归

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        n=len(p)
        m=len(s)
        i=0
        if not s:
            if not p:
                return True
            elif p[0]=='*':
                return self.isMatch(s[:],p[1:])
            else:
                return False
        if not p:
            return False
        if p[0]==s[0] or p[0]=='?':
            return self.isMatch(s[1:],p[1:])
        elif p[0]=='*':
            return self.isMatch(s[:],p[1:])or self.isMatch(s[1:],p[:])
        else:
            return False
class Solution:
    
    def isMatch(self, s: str, p: str) -> bool:
        self.dp={}
        def helper(s,p):
            n=len(p)
            m=len(s)
            i=0
            if (s,p) in self.dp:
                return self.dp[(s,p)]
            if not s:
                if not p:
                    self.dp[(s,p)]=True
                    return self.dp[(s,p)]
                elif p[0]=='*':
                    self.dp[(s,p)]= helper(s[:],p[1:])
                    return self.dp[(s,p)]
                else:
                    self.dp[(s,p)]=False
                    return self.dp[(s,p)]
            if not p:
                self.dp[(s,p)]=False
                return self.dp[(s,p)]
            if p[0]==s[0] or p[0]=='?':
                self.dp[(s,p)]=self.isMatch(s[1:],p[1:])
                return self.dp[(s,p)]
            elif p[0]=='*':
                self.dp[(s,p)]=self.isMatch(s[:],p[1:])or self.isMatch(s[1:],p[:])
                return self.dp[(s,p)]
            else:
                self.dp[(s,p)]=False
                return self.dp[(s,p)]
        helper(s,p)
        return self.dp[(s,p)]

dp

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        len_s=len(s)
        len_p=len(p)
        i=0
        j=0
        dp=[[False]*(len_p+1) for i in range(len_s+1)]
        # if p[0]==s[0] or p[0]=='?':
        #     dp[0][0]=True
        # elif p[0]=='*':
        #     dp[0][0]=True
        dp[0][0]=True
        for i in range(1,len_p+1):
            if p[i-1]=='*':
                dp[0][i]=dp[0][i-1]
        for i in range(1,len_s+1):
            for j in range (1,len_p+1):
                if p[j-1]==s[i-1]or p[j-1]=='?':
                    dp[i][j]=dp[i-1][j-1]
                elif p[j-1]=='*':
                    dp[i][j]=dp[i][j-1]or dp[i-1][j]
        return dp[-1][-1]

回溯

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        len_s=len(s)
        len_p=len(p)
        i=0
        j=0
        star=-1
        match=0
        while i<len_s:
            if (j<len_p) and ( s[i]==p[j]or p[j]=='?'):
                i+=1
                j+=1
            elif (j<len_p) and p[j]=='*':
                star=j
                match=i
                j+=1
            elif star!=-1:
                match+=1
                i=match
                j=star+1
            else :
                return False
        while j<len_p and p[j]=='*':
            j+=1
        return j>=len_p
class Solution:
    def isMatch(self, s: str, p: str) -> bool:

        m = len(s)
        n = len(p)
       
        i = j = 0
        im = jn = -1
        while i < m:
            if j < n and (s[i] == p[j] or p[j] == '?'):
                i += 1
                j += 1
            elif j < n and  p[j] == "*":
                # 默认情况,* 不匹配任意字符
                im = i
                j += 1
                jn = j
            elif im > -1:
                # 已经发现一个*
                i = im + 1
                j = jn 
                im = i
            else:
                return False
        
        while j < n and p[j] == "*":
            j += 1
        
        return j  >= n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值