首页 > 试题广场 >

字符串通配符

[编程题]字符串通配符
  • 热度指数:180681 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}在计算机中,通配符是一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。让我们来学习通配符的匹配规则:
\hspace{23pt}\bullet\,\texttt{`*'} 符号代表匹配 0 个或以上的数字或字母;
\hspace{23pt}\bullet\,\texttt{`?'} 符号代表匹配 1 个数字或字母;
\hspace{23pt}\bullet\,小写字母字符代表匹配自身和自身的大写字母形态;
\hspace{23pt}\bullet\,大写字母字符代表匹配自身和自身的小写字母形态;
\hspace{23pt}\bullet\,其他字符代表匹配自身。

\hspace{15pt}现在,对于给定的通配符字符串 s 和目标字符串 p不考虑大小写,请判断 s 是否可以匹配得到 p。如果可以,输出 \rm true;否则,输出 \rm false

\hspace{15pt}在本题中,给定的字符串由 ASCII 码在 33126 范围内的可见字符构成。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。
../图片/AllAscii.png

输入描述:
\hspace{15pt}第一行输入一个长度为 1 \leqq {\rm len}(s) \leqq 100、由可见字符构成的通配符字符串 s
\hspace{15pt}第二行输入一个长度为 1 \leqq {\rm len}(p) \leqq 100 、由可见字符构成的目标字符串 p


输出描述:
\hspace{15pt}如果可以匹配得到,输出 \textrm{true};否则,输出 \textrm{false}
示例1

输入

z
zz

输出

false
示例2

输入

Z*
zz

输出

true

说明

\hspace{15pt}在这个样例中,\texttt{`*'} 匹配 \texttt{`z'}。注意,由于不区分大小写,\texttt{`Z'} 可以匹配 \texttt{`z'}
示例3

输入

?*
zz

输出

true

说明

\hspace{15pt}在这个样例中,\texttt{`?'} 匹配 \texttt{`z'}\texttt{`*'} 匹配 \texttt{`z'}
示例4

输入

**Z
0QZz

输出

true

说明

\hspace{15pt}在这个样例中,其中一种匹配方法是:
\hspace{23pt}\bullet\,第一个 \texttt{`*'} 匹配 \texttt{
\hspace{23pt}\bullet\,第二个 \texttt{`*'} 匹配 \texttt{`Z'}
\hspace{23pt}\bullet\,第三个 \texttt{`Z'} 匹配 \texttt{`z'}
示例5

输入

??**
zz

输出

true

说明

\hspace{15pt}\texttt{`*'} 可以匹配 0 个字符。
示例6

输入

HH?*
HH##1

输出

false

说明

\hspace{15pt}可被 \texttt{`*'}\texttt{`?'} 匹配的字符不包含 \texttt{`\#'}
头像 KazamaHifumi
发表于 2021-11-15 20:32:45
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf 展开全文
头像 牛客666号.
发表于 2022-03-05 07:51:04
这题难点我觉得在理解题目到底想让你干什么上面!! 理解了以后用正则其实非常简单 这道题问的是上面那个字符串能不能完全代表下面那个字符串!! 这就是为什么例子里面z不能匹配zz的原因,因为z只能代表一个字符,而zz有俩字符。所以能代表zz的有z*,z?,zz,??,,,,****,*,**...。 i 展开全文
头像 人生苦短,但求成长
发表于 2022-02-12 16:48:47
def fun(str1, str2): if str1 == '' and str2 == '': return True elif str1 == '' and str2 != '': return False elif str1 != 展开全文
头像 一条余弦Cos
发表于 2020-12-13 22:42:13
采用递归的思路。从前向后依次匹配: 遇到相同字符,都向后移动一个字符; 如果通配符遇到"?",则不需匹配,自动跳过一个字符; 如果通配符遇到"*",则可以匹配任意多个字符,包括0个,此时可以有三种选择: 1.匹配0个,通配符向后移动一个字符,字符串不动; 2.匹配1个,通配符和字符 展开全文
头像 FifteenthOfJuly
发表于 2020-05-28 15:36:08
我承认我有投机取巧的成分,但是用正则表达式来做的话会很简单。暂且就认为测试用例和题目上的差不多,正则表达式中只含有"? * ."这三种,将其替换为对应的就可以了。 import java.util.Scanner; /** * 实现通配符 * ? 匹配一个字符 [0-9A-Za-z]{1} 展开全文
头像 牛客782612709号
发表于 2022-01-23 10:32:22
递归方法 新手。讨论区大佬们直接上代码的多,看代码逆推思路so吃力。 好在力扣上找到了详细思路(力扣第44题),梳理半天,终于敲出来了。记录如下: 匹配逻辑 从右向左识别符号,通配符p可能有三种类型: 1.普通字符 2.? 3.* 前两种情况可以合并为检查字符串s(n-2) 与通配符 p(m-2) 展开全文
头像 WIliCai
发表于 2021-12-06 18:09:43
采用动态规划,去看力扣44题就知道 怎么做了 import java.io.*; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader br=n 展开全文
头像 BSF
发表于 2021-10-22 01:13:55
def match(p, s): m, n = len(p), len(s) ''' 初始化边界: 1、dp[0][0] = True,空模式空字符串,匹配成功; 2、dp[0][j] = False,空模式无法匹配非空字符串; 展开全文
头像 牛客412602128号
发表于 2021-10-30 21:44:34
import re while True: try: s1 = input().lower() s2 = input().lower() s1 = s1.replace('.', '\.').replace('?', '[0-9a-z]').r 展开全文
头像 我心态贼好
发表于 2020-08-01 09:25:15
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNe 展开全文

问题信息

难度:
316条回答 36085浏览

热门推荐

通过挑战的用户

查看代码
字符串通配符