"""
题目:请实现一个函数用来匹配包括‘.’和‘*’的正则表达式。模式中的字符‘.’表示任意一个字符,而"*"表示它前面的字符可以出现
任意次(包括0次)。例如,字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与“aa.a”和"ab*a"均不匹配
"""
class Solution:
def __init__(self, string, pattern):
self.string = string
self.pattern = pattern
self.pattern_length = len(pattern)
self.string_length = len(string)
def function(self):
if self.string is None or self.pattern is None:
return False
return self.match(0, 0)
def match(self, string_index, pattern_index):
# 判断当前两个指针是否越界
# 同时越界, 说明全部匹配成功, 程序结束
if string_index >= self.string_length and pattern_index >= self.pattern_length:
return True
# 如果string_index没有走完,但是pattern_index走完了,那就肯定匹配不成功
if string_index < self.string_length and pattern_index >= self.pattern_length:
return False
# 剩下的一种情况,string_index走完,pattern_index没有走完,可能是a*
# 当前子串(以指针开头)第二个字符是‘*', 比较复杂
if pattern_index+1 < self.pattern_length and self.pattern[pattern_index+1] == '*':
# 首字符匹配成功
if ((string_index < self.string_length) and self.string[string_index] == self.pattern[pattern_index]) or \
(self.pattern[pattern_index] == '.' and string_index < self.string_length):
return self.match(string_index+1, pattern_index) or self.match(string_index+1, pattern_index+2) or \
self.match(string_index, pattern_index + 2)
# 如果匹配不成功,那只能把(首字符*)忽略掉了,不然就得当成匹配不成功
else:
return self.match(string_index, pattern_index+2)
# 当前子串第二个字符不是‘*’,情况比较简单
# 当前子串的第一个字符匹配成功,两个索引指针同时向后挪
if ((string_index < self.string_length) and self.string[string_index] == self.pattern[pattern_index]) or \
(self.pattern[pattern_index] == '.' and string_index < self.string_length):
return self.match(string_index+1, pattern_index+1)
return False
if __name__ == '__main__':
# 测试用例
# string = 'aaa'
# pattern = 'a.*a' # 匹配
# string = 'aaa'
# pattern = 'ab*ac*a' # 匹配
string = 'aaa'
pattern = 'ab*a' # 不匹配
s = Solution(string, pattern)
print(s.function())
剑指offer:019正则表达式匹配
最新推荐文章于 2023-05-15 19:36:51 发布