题解 | #字符串通配符#

字符串通配符

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

# 用动态规划
# dp[i][j] 表示 s1[0:i+1],s2[0:j+1] 是否匹配
# s1[i]!=s2[j]: False
# s1[i] == '?': 看 dp[i-1][j-1]
# s1[i] == '*': 看所有的dp[i-1][0:j+1] 有 True 就是 True
while True:
    try:
        s1,s2 = input(),input()
        n1,n2 = len(s1),len(s2)
        dp = [[0]*n2 for i in range(n1)]
        for i in range(n1):
            for j in range(n2):
                if i == 0:
                    if s1[i] == '*' and s2[j].isalnum():
                        dp[i][j] = True
                    else:
                        if j > 0:
                            dp[i][j] = False
                        else:
                            if (s1[i] == '?' and s2[j].isalnum()) or s1[i].lower() == s2[j].lower():
                                dp[i][j] = True
                            else:
                                dp[i][j] = False
                elif j == 0:
                    tmp = ""
                    for mm in s1[0:i+1]:
                        if mm == "*":
                            pass
                        else:
                            tmp += mm
                    if len(tmp) > 1:
                        dp[i][j] = False
                    elif len(tmp) == 1:
                        if (tmp == '?' and s2[j].isalnum()) or tmp.lower() == s2[j].lower():
                            dp[i][j] = True
                        else:
                            dp[i][j] = False
                else:
                    if s1[i] != '*' and s1[i] != '?':
                        if s1[i].lower() != s2[j].lower():
                            dp[i][j] = False
                        else:
                            dp[i][j] = dp[i-1][j-1]
                    elif s1[i] == '?':
                        if s2[j].isalnum():
                            dp[i][j] = dp[i-1][j-1]
                        else:
                            dp[i][j] = False
                    else: # '*'
                        dp[i][j] = False
                        for mm in range(0,j+1):
                            if dp[i-1][mm] == True:
                                dp[i][j] = True
                                break
        if dp[n1-1][n2-1]:
            print('true ')
        else:
            print('false ')
    except:
        break



全部评论

相关推荐

吴offer选手:下午mt一来就告警说项目来不及,估计明天拿了权限就要参与开发了 已老实
实习生的蛐蛐区
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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