标签:字符 匹配 输出 示例 牛客 HJ71 机试 false 输入
题目
描述
问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母,数字0-9和 '.' 组成,下同)
?:匹配1个字符
注意:匹配时不区分大小写。
输入:
通配符表达式;
一组字符串。
输出:
返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false
本题含有多组样例输入!
输入描述:
先输入一个带有通配符的字符串,再输入一个需要匹配的字符串
输出描述:
返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false
示例1
输入:
te?t*.*
txt12.xls
输出:
false
示例2
输入:
z
zz
输出:
false
示例3
输入:
pq
pppq
输出:
false
示例4
输入:
**Z
0QZz
输出:
true
示例5
输入:
?*Bc*?
abcd
输出:
true
示例6
输入:
p*p*qp**pq*p**p***ppq
pppppppqppqqppqppppqqqppqppqpqqqppqpqpppqpppqpqqqpqqp
输出:
false
解题思路
(1)对输入的案例进行规则推倒,采用动态规划进行求解
(2)根据题目要求:
*:匹配0个或以上的字符(字符由英文字母,数字0-9和 '.' 组成,下同)
?:匹配1个字符
并且匹配时不区分大小写
(3)p = "**Z", s = "0QZz",长度分别为3和4,因此构造4*5的矩阵
“” | * | ** | **Z | |
“” | 1 | 1 | 1 | 0 |
0 | 0 | 1 | 1 | 0 |
0Q | 0 | 1 | 1 | 0 |
0QZ | 0 | 1 | 1 | 1 |
0QZz | 0 | 1 | 1 | 1 |
(4)得到规则,第一列除了第一个“”==“”为1,其余为0
(5)从第一行开始遍历每一列,对比s与p新增的最后一个字符
(6)如果匹配到的为“*”或者“?”则,该位置能否匹配的前提是看左边位置能否匹配
if i==0:
if p[j-1]=="*" or p[j-1]=="?":
f[i][j] = f[i][j-1]
“” | * | ** | **Z | |
“” | 1 | 1 | 1 | 0 |
(7)对于非第一行的元素,可以匹配到规则:
对于匹配的字符为“?”或者字符相同
新增字符相同,或者p新增的字符属于“?”且s中新增的字符在a-z和0-9之间,那么该位置能否匹配的前提是看左上角位置能否匹配,左上角的数学意义为不考虑新增字符时能否匹配
elif p[j-1] == s[i-1] or (p[j-1]=="?" and (s[i-1].isalpha() or s[i-1].isdigit())):
f[i][j] = f[i-1][j-1]
“” | * | ** | **Z | |
“” | 1 | 1 | 1 | 0 |
0 | 0 | 1 | 1 | 0 |
0Q | 0 | 1 | 1 | 0 |
0QZ | 0 | 1 | 1 | 1 |
0QZz | 0 | 1 | 1 | 1 |
对于匹配的字符为*
则该位置能否匹配的前提是看三个位置,只需要满足其中一个位置,则匹配
看左上角位置能否匹配,左上角的数学意义*匹配1个字符
看左边位置能否匹配,左边的数学意义为*匹配0个字符
看上边位置能否匹配,上边的数学意义为*匹配多个字符
elif p[j-1]=="*" and (s[i-1].isalpha() or s[i-1].isdigit()):
f[i][j] = (f[i-1][j] or f[i-1][j-1] or f[i][j-1])
“” | * | ** | **Z | |
“” | 1 | 1 | 1 | 0 |
0 | 0 | 1 | 1 | 0 |
0Q | 0 | 1 | 1 | 0 |
0QZ | 0 | 1 | 1 | 1 |
0QZz | 0 | 1 | 1 | 1 |
代码
def isMatch(p: str, s: str) -> bool:
m, n = len(s), len(p)
f = [[False] * (n + 1) for _ in range(m + 1)]
f[0][0] = True
for i in range(m + 1):
for j in range(1, n + 1):
if i==0:
if p[j-1]=="*" or p[j-1]=="?":
f[i][j] = f[i][j-1]
elif p[j-1] == s[i-1] or (p[j-1]=="?" and (s[i-1].isalpha() or s[i-1].isdigit())):
f[i][j] = f[i-1][j-1]
elif p[j-1]=="*" and (s[i-1].isalpha() or s[i-1].isdigit()):
f[i][j] = (f[i-1][j] or f[i-1][j-1] or f[i][j-1])
else:
f[i][j] = False
return f[m][n]
while True:
try:
instr1 = input()
instr2 = input()
print(str(isMatch(instr1.lower(), instr2.lower())).lower())
except:
break
Reference
标签:字符,匹配,输出,示例,牛客,HJ71,机试,false,输入 来源: https://blog.csdn.net/weixin_37474682/article/details/120480780
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。