321
社区成员




已知一个字符串a,b。 字符串b中包含特殊符号’.’,’’。 ‘.’表示该字符可以变成任意字符,’ ‘表示该字符的前一个字符可以变成任意多个。 现在我们想知道b可否通过特殊符号变成a。 a* 可以转化为a,aa,aaa,aaaa…
第一行输入字符串a.(1<=len(a)<=1000)
第二行输入字符串b.(1<=len(b)<=1000)
如果可以输出”yes”,否则输出’no’
这个题目,和 leetcode 的第 44 题一模一样了,leetcode 的描述如下
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
'*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
那么如果有兴趣的话,可以到 leetcode 里看题解,也可以看看老顾的实现。
不过,今天咱们就偷个懒,直接用现成的正则完成题目就好。
import re
s,p = input(),input()
pattern = re.sub('^[\*]','',re.sub(r'[\*]+','*',p))
print('yes' if len(pattern) > 0 and re.fullmatch(pattern,s) else 'no')
这里对输入的 p 字符串进行了一些预处理,比如多个星号合并为1个星号,开头星号干掉,最后验证匹配规则长度大于0,用 fullmatch 来进行完全匹配验证
js 版本也类似,唯一区别就是没有 fullmatch 类似的方法,需要自己加 ^ 和 $
var s = readline();
var p = readline().replace(/[\*]+/gi,'*').replace(/^[\*]/gi,'');
print(p && new RegExp('^' + p + '$','gi').test(s) ? 'yes' : 'no');