题解 | #字符串通配符#

字符串通配符

http://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

递归方法

新手。讨论区大佬们直接上代码的多,看代码逆推思路so吃力。
好在力扣上找到了详细思路(力扣第44题),梳理半天,终于敲出来了。记录如下:

匹配逻辑

从右向左识别符号,通配符p可能有三种类型:
1.普通字符
2.?
3.*
前两种情况可以合并为检查字符串s(n-2) 与通配符 p(m-2) 是否匹配。
第三种分为两个情形:
(1)无视* 字符串s(n-1) 与通配符 p(m-2) 是否匹配。
(2)考虑* 字符串s(n-2) 与通配符 p(m-1) 是否匹配。

边界条件

重中之重,这块也是我卡死两小时的真正原因。需要分别考虑字符串为空、通配符为空的情形。
(我觉得这个技能点属于经验型,新上手时不妨先背个例题,然后按使用场景优化。)
归纳如下:
1.字符串s='' 通配符 p='' 匹配结果为 True
2.字符串s!='' 通配符 p='' 匹配结果为 False
3.字符串s='' 通配符 p!='' 继续分两种情况:
(1) p里全是* 匹配结果为 True
(2) p里不全是* 匹配结果为 False
4.字符串与通配符均不为'',则需要开展比对,按三种开头梳理的三种类型分别设计检查判断

两个用例卡点

1.需要在通配符比对'?'环节 添加数字字母鉴别 str.isalnum()
2.需要在字母比对环节 添加字母统一转小写 str.lower()

class Solution:
    def match(self, p:str, s:str) ->bool:
      # 边界定义-各种单边或双边为空的情况  
      if s=='' and p=='':
            return True
        elif s!='' and p=='':
            return False
        elif s=='' :
            if p.replace('*','')=='':
                return True
            else:
                return False
        # 字符串与通配符均不为空,递归检查
        else:
            n,m = len(s),len(p)
            '''通配符是问号或者字母'''
            if (p[m-1]=='?'and s[n-1].isalnum()) or p[m-1].lower()==s[n-1].lower():
                return self.match(p[0:m-1],s[0:n-1])
            '''通配符是星号'''
              elif p[m-1]=='*':
                return self.match(p[0:m-1],s) or self.match(p,s[0:n-1])
            '''通配符不是问号或者字母,还跟字符串匹配不上'''
              else:
                return False
while True:
    try:
        p,s = input(),input()
        s1 = Solution()
        print('true' if s1.match(p,s) else 'false')
        
    except:
        break

力扣题解:44.通配符匹配
相似题(进阶):10.正则表达式匹配

全部评论
**aa*****ba*a*bb**aa*ab****a*aaaaaa***a*aaaa**bbabb*b*b**aaaaaaaaa*a********ba*bbb***a*ba*bb*bb**a*b*bb abbabaaabbabbaababbabbbbbabbbabbbabaaaaababababbbabababaabbababaabbbbbbaaaabababbbaabbbbaabbbbababababbaabbaababaabbbababababbbbaaabbbbbabaaaabbababbbbaababaabbababbbbbababbbabaaaaaaaabbbbbaabaaababaaaabb 这个测试用例超时,用递归效率不太行。要么将递归改成while循环,要么用动态规划,才行。
点赞 回复 分享
发布于 2024-05-04 11:10 广东
对*号的处理太玄妙了,大佬 666
点赞 回复 分享
发布于 2023-02-17 15:20 上海
执行报错哎 看不太懂
点赞 回复 分享
发布于 2022-08-16 23:23 广东
牛逼啊 兄dei
点赞 回复 分享
发布于 2022-06-16 23:32
为什么做递归要从S和P的最后一个元素开始呢?
点赞 回复 分享
发布于 2022-04-10 12:06
看不懂,大佬666
点赞 回复 分享
发布于 2022-03-09 22:01

相关推荐

XingHaozhe:没啥大问题啊,Agent + 后端业务,勇敢投!
点赞 评论 收藏
分享
评论
26
10
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务