老卫带你学---leetcode刷题(44. 通配符匹配)

文章介绍了如何使用动态规划方法实现一个支持问号(?)和星号(*)的字符串匹配函数,通过移除重复的星号并利用状态转移方程来判断输入字符串是否能与字符模式完全匹配。
摘要由CSDN通过智能技术生成

44. 通配符匹配

问题:

给你一个输入字符串 (s) 和一个字符模式 § ,请你实现一个支持 ‘?’ 和 ‘’ 匹配规则的通配符匹配:
‘?’ 可以匹配任何单个字符。
'
’ 可以匹配任意字符序列(包括空字符序列)。
判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。

示例 1:

输入:s = “aa”, p = “a”
输出:false
解释:“a” 无法匹配 “aa” 整个字符串。
示例 2:

输入:s = “aa”, p = ""
输出:true
解释:'
’ 可以匹配任意字符串。
示例 3:

输入:s = “cb”, p = “?a”
输出:false
解释:‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。

解决:

DP动态规划

class Solution:

    def removeDuplicatedStar(self,p): #移除重复的*
        if not p:
            return p
        ans=[p[0]]
        for i in range(1,len(p)):
            if p[i]=="*" and p[i]==p[i-1]:
                continue
            ans.append(p[i])
        return ''.join(ans)

    def isMatch(self, s: str, p: str) -> bool:
        p=self.removeDuplicatedStar(p)
        
        @lru_cache   #lru记忆化存储
        def dp(i,j):
            if j==len(p)-1 and p[j]=='*': return True #这三行进行长度匹配,因为需要完全匹配
            if j>=len(p): return i>=len(s)
            if i>=len(s): return j>=len(p)
            first_match=s[i]==p[j] or p[j]=='?'or p[j]=='*'

            if not first_match:
                return False

            if p[j]=='?' or s[i]==p[j]: #如果有一位匹配,那么结果就是dp(i+1,j+1)
                return dp(i+1,j+1)

            if p[j]=='*': #如果有一位*,那么结果就是dp(i,j+1) or dp(i+1,j)
                return dp(i,j+1) or dp(i+1,j)
        return dp(0,0) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值