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)
文章介绍了如何使用动态规划方法实现一个支持问号(?)和星号(*)的字符串匹配函数,通过移除重复的星号并利用状态转移方程来判断输入字符串是否能与字符模式完全匹配。
200

被折叠的 条评论
为什么被折叠?



