用化归的思维方法解决LeetCode题库第44题通配符匹配问题

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中只可能是这样几种情况:

  1. 没有通配符
  2. 只有“?”通配符
  3. 只有“*”通配符
  4. “?”和“*”两种通配符都有,“?”在前“*”在后
  5. “?”和“*”两种通配符都有,“?”在后“*”在前

且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

感悟:要善于把复杂问题简单化,用化归思想来解决问题。大道至简,简单是一种美丽!更是我们解决问题的一种法宝!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值