44. 通配符匹配
难度:困难
问题描述:
给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 '?' 和 '*' 匹配规则的通配符匹配:
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符序列(包括空字符序列)。
判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。
示例 1:
输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:s = "aa", p = "*"
输出:true
解释:'*' 可以匹配任意字符串。
示例 3:
输入:s = "cb", p = "?a"
输出:false
解释:'?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
提示:
0 <= s.length, p.length <= 2000
s 仅由小写英文字母组成
p 仅由小写英文字母、'?' 或 '*' 组成
分析:
按照一般的通配符使用规则,字符模式p中只可能是这样几种情况:
- 没有通配符
- 只有“?”通配符
- 只有“*”通配符
- “?”和“*”两种通配符都有,“?”在前“*”在后
- “?”和“*”两种通配符都有,“?”在后“*”在前
且p中最多只包含一个“?”和“*”
为此针对这几种情况编写对应的处理函数,调用函数即可解决问题。
程序如下:
#输入字符串s和字符模式p
s=input('pls input s=')
p=input('pls input p=')
'''分成几种情况来处理
1、p中未含通配符,要完全匹配
2、p中含有通配符?
3、p中含有通配符*
4、p中含有通配符?*
5、p中含有通配符*?
'''
#1、p中没有通配符*?
def nopatter(s,p):
return p==s
#2、p中只含有通配符?
def patterw(s,p):
if len(p)!=len(s):
return False
else:
for i in range(len(p)):
if s[i]==p[i] or p[i]=='?':
continue
else:
return False
else:
return True
#3、p中只含有通配符*
def patterx(s,p):
if p[0]=='*':
a=p[1:]
return s.endswith(a)
elif p[-1]=='*':
a=p[:len(p)-1]
return s.startswith(a)
else:
a=p.split('*')
return s.startswith(a[0]) and s.endswith(a[1])
#4、p中含有?*,且?在前,*在后
def patterwx(s,p):
a=p.split('?')
if a[0]=='':
p1=p[1:]
s1=s[1:]
return patterx(s1,p1)
else:
return a[0]==s[:len(a[0])] and patterx(s[len(a[0])+1:],p[len(a[0])+1:])
#5、p中含有*?,且*在前,?在后
def patterxw(s,p):
a=p.split('?')
if a[1]=='':
p1=p[:-1]
s1=s[:-1]
return patterx(s1,p1)
else:
return a[1]==s[-len(a[1]):] and patterx(s[:-(len(a[1])+1)],a[0])
#分几种情况分别调用不同函数处理得到结果
if '?' not in p and '*' not in p:
s=nopatter(s,p)
elif '?' in p and '*' not in p:
s=patterw(s,p)
elif '?' not in p and '*' in p:
s=patterx(s,p)
else:
x=p.index('?')
y=p.index('*')
if x<y:
s=patterwx(s,p)
else:
s=patterxw(s,p)
print(s)
运行实例1:
pls input s=abc
pls input p=abc
True
运行实例2:
pls input s=abcdefgh
pls input p=ab?defgh
True
运行实例3:
pls input s=abcdefgh
pls input p=ab*fgh
True
运行实例4:
pls input s=abcdefghi
pls input p=ab?de*i
True
运行实例5:
pls input s=abcdeabcd
pls input p=abc*?d
True
感悟:要善于把复杂问题简单化,用化归思想来解决问题。大道至简,简单是一种美丽!更是我们解决问题的一种法宝!