题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
题目地址
思路
我们先来分析如何匹配一个字符,现在只考虑'.',不考虑'*':
如果字符串和模式串的当前字符相等,那么我们继续匹配它们的下一个字符;如果模式串中的字符是'.',那么它可以匹配字符串中的任意字符,我们也可以继续匹配它们的下一个字符。
接下来,把字符'*'考虑进去,它可以匹配任意次的字符,当然出现0次也可以:
而当模式中的第二个字符是*时:
如果字符串第一个字符跟模式第一个字符匹配(包括模式串为'.'的情况),可以有3种匹配方式:
1. 模式后移2字符,相当于x*被忽略;
2. 字符串后移1字符,模式后移2字符,正好匹配x*中的'x'位;
3. 字符串后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位;
如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配,相当于把模式串中的当前字符和'*'忽略掉。
当模式中的第二个字符不是*时,也就是上面说的只有字符'.'的情况。
1. 如果字符串第一个字符和模式中的第一个字符相匹配(包括模式串为'.'的情况),那么字符串和模式都后移一个字符,然后匹配剩余的。
2. 如果字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。
Python
# -*- coding:utf-8 -*- class Solution: # s, pattern都是字符串 def match(self, s, pattern): if s == pattern: return True if not pattern: return False if len(pattern) > 1 and pattern[1] == '*': if s and (s[0] == pattern[0] or pattern[0] == '.'): return self.match(s,pattern[2:]) or self.match(s[1:],pattern[2:]) or self.match(s[1:],pattern) else: return self.match(s,pattern[2:]) elif s and (s[0] == pattern[0] or pattern[0] == '.'): return self.match(s[1:],pattern[1:]) return False if __name__ == '__main__': result = Solution().match('a','.') print(result)
作者:huangqiancun
出处:http://www.cnblogs.com/huangqiancun/
本博客若无特殊说明则由作者原创发布,欢迎转载,但请注明出处 :)