实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
思路:
参考度娘其他大佬的思路,总结了一下。
匹配总共分两种情况:
模式的第二位是否为“*”:
1、是“*”:
则有三种匹配方式:
模式第一个与字符串第一个相等或者模式第一个为“.”(代表任意),直接模式和字符串都加1。
字符串第一个与模式的“*”后一位相等,字符串不动,模式加2。
字符串连续几个相同,模式不变,字符串加1.
2、不是“*”:
模式第一个与字符串第一个相等或者模式第一个为“.”(代表任意),直接模式和字符串都加1;
否则匹配不成功。
注意
判断字符串为空和模式为空的情况
若以上都走完,剩下的情况都是不匹配
def isMatch(self, s: str, p: str) -> bool:
if not p:
return not s
if len(p)>1 and p[1]=='*':
return (s and (s[0]==p[0]or p[0]=='.'))and self.isMatch(s[1:],p)or self.isMatch(s,p[2:])
else :
return (s and (s[0]==p[0] or p[0]=="."))and self.isMatch(s[1:],p[1:])