题解 | #字符串通配符#

字符串通配符

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

借鉴了各种大佬的解法,总结了三种解法,前两种思路是一样的

p为通配符表达式 s是为字符串

1,当p 和 s都为空时: ture

2,当p等于空,s不为空: false

3 ,当p不为空,s为空时:

1,p里面字符全都是“*”:true

2,p里面字符含有除“*”以外的字符 : false

4,当p,s都不为空时,分为以下几种:

1,当p[m-1]=="*"

1,s[n-1]是数字或者字母(用isalnum()判断):

2s[n-1]不是数字或者字母:

2,当p[m-1]=="?" 并且s[n-1]是数字或者字母时:

3,当p[m-1]..lower()==s[n-1].lower()

具体代码如下:

一 递归:

def func(p,s):
    m,n=len(p),len(s)
    if p==''and s=='':
        return True
    elif p=='' and s!='':
        return False
    elif p!='' and s=='':
        if p.replace("*",'')=='':
            return True
        else:
            return False
    else:
        if p[m-1]=="*":
            if s[n-1].isalnum():#必须进行讨论,不然像tx#*.* tx#t.zxy这种程序会返回false
                return func(p,s[:n-1]) or func(p[:m-1],s)
            else:
                return  func(p[:m-1],s)
        elif p[m-1]=="?" and s[n-1].isalnum():
            return func(p[:m-1],s[:n-1])
        elif p[m-1].lower()==s[n-1].lower():
            return func(p[:m-1],s[:n-1])
        else:
            return False
p=input()
s=input()
while True:
    try:
        if func(p,s):
            print("true")
        else:
            print("false")
    except:
        break

二,动态规划法

while True:
    try:
        p,s=input(),input()
        m,n=len(p),len(s)
        dp=[[False for _ in range(n+1)]for _ in range(m+1)]
        #定义dp[i][j]为p[0:i]是否匹配s[0:j]的二维数组
        dp[0][0]=True
        for i in range(1,m+1):
            if p[i-1]=="*":
                dp[i][0]=dp[i-1][0]
        for i in range(1,m+1):
            for j in range(1,n+1):
                if p[i-1]=="*":
                    if s[j-1].isalnum():
                        dp[i][j]=dp[i-1][j] or dp[i][j-1]
                    else:
                        dp[i][j]=dp[i-1][j]
                elif p[i-1]=="?" and s[j-1].isalnum():
                    dp[i][j] = dp[i-1][j-1]
                elif p[i-1].lower()==s[j-1].lower():
                    dp[i][j]=dp[i-1][j-1]
        if dp[m][n]:
            print("true")
        else:
            print("false")
    except:
        break

三,正则表达式

import re
while True:
    try:
        # 依题意,能被*和?匹配的字符仅由英文字母和数字0到9组成,即对应[a-zA-Z0-9]
        # 在re的pattern种,“.”表示的全匹配(任何字符),所以需要先转义
        # ? 表示匹配一个字符,而re的pattern的"?"表示0或1次,所以要直接使用[a-zA-Z0-9]替换
        # * 表示匹配0或多个,和re的pattern的"*"意思一致,所以可以只用[a-zA-Z0-9]*来替换
        p,s=input(),input()
        p=p.replace(".","\.").replace("?","[a-zA-Z0-9]").replace("*","[a-zA-Z0-9]*")
        if s in re.findall(p,s,re.I): # 因为用到了re.I(不区分大小写),所以上面就算直接使用[A-Z0-9]或[a-z0-9]也是一样的效果
            print("true")
        else:
            print("false")
    except:
        break

全部评论

相关推荐

喜欢核冬天的哈基米很想上市:会爆NullPointerException的
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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