题解 | #字符串通配符#

字符串通配符

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

写长一点方便每步都加注释容易理解。同时注意必须要加visit防止重复递归进入死循环可用最后一个case正序和倒序输入测试是否会死循环。

def fun2():
    def dfs(s: str, rule: str):
	# 递归边界判断
        if (s, rule) in visit:                           # 当前组合已经访问过了就抬走
            return False
        visit.append((s, rule))
        if s == "" and rule == "":                       # s完毕且rule刚好完毕,ok
            return True
        elif s != "" and rule == "":                     # s未完毕,rule完毕,gg
            return False
        elif s == "" and rule != "":                     # s完毕,rule未完毕,看rule是否只剩下*
            if rule.replace("*", "") == "":              # 只剩下*,ok
                return True
            else:                                        # 还有其他rule值,gg
                return False
	# 开始递归
        if s[0] == rule[0]:                              # 直接就相等抬走下一位
            return dfs(s[1:], rule[1:])
        else:
            if rule[0] == "?" and s[0].isalnum():        # 是?的时候必须要是数字字母才进入匹配
                return dfs(s[1:], rule[1:])
            elif rule[0] == "*":                         # 是*的时候分进入和跳过
                if s[0].isalnum() and dfs(s[1:], rule):  # * 匹配,s往后移
                    return True
                elif dfs(s, rule[1:]):                   # * 不匹配, rule往后移
                    return True
                else:
                    return False

    rule, s, visit = input().lower(), input().lower(), []
    print("true" if dfs(s, rule) else "false")


fun2()

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务