面试题19:正则表达式匹配
2020-03-04 本文已影响0人
不会编程的程序猿甲
题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。
思路:这道题需要全面考虑:因为*比较特殊,可以与他前面0个-多个同一字符匹配,因此需要根据情况对*的情况进行考虑,具体如下思维导图:
正则表达式匹配.png
代码实现:
# -*-coding:utf-8 -*-
class Solution:
# s, pattern都是字符串 利用递归实现
def match(self, s, pattern):
#特殊情况
if len(s)==0 and len(pattern)==0:
return True
if (len(s)>0 and len(pattern)==0):
return False
# 1.第二个字符是*的情况
if len(pattern)>1 and pattern[1]=='*':
if len(s)>0 and (pattern[0]==s[0] or pattern[0]=='.'): #模式匹配
return self.match(s[1:],pattern) or self.match(s[1:],pattern[2:]) or self.match(s,pattern[2:])
else:
return self.match(s,pattern[2:])
# 2. 第二个字符不是"*",包括只有一个字符的情况
if (len(pattern)>1 and pattern[1]!='*') or len(pattern)==1:
if len(s)>0 and (pattern[0]==s[0] or pattern[0]=='.'):
return self.match(s[1:],pattern[1:])
else:
return False
s ="aaaa"
pattern = "a.a*"
print(Solution().match(s,pattern))
运行结果:
牛客网提交结果.png