題目:請實現一個函數用來匹配包括'.'和'*'的正則表達式。模式中的字符'.'表示任意一個字符,而'*'表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配。
class Solution:
def re_match(self, str, pattern):
if len(str)==0 and len(pattern)==0:
return True
if len(str)>0 and len(pattern)==0:
return False
# 當pattern中第二個字符是*時
if len(pattern)>1 and pattern[1]=="*":
# 如果字符串跟匹配模式第一個字符匹配或者'.'匹配,則有三種匹配方式
if len(str)>0 and (str[0]==pattern[0] or str[0]=="."):
# 1.模式後移兩位,相當於x*被忽略
# 2.字符串後移一位,模式後移兩個字符
# 3.字符串後移一位,模式不變,即字符串繼續匹配下一位,因*可以匹配前面的字符0次至多次
return self.re_match(str, pattern[2:]) or self.re_match(str[1:], pattern[2:]) or self.re_match(str[1:], pattern)
else:
return self.re_match(str, pattern[2:])
# 當pattern中第二個字符不是*時
# 1.如果字符串跟匹配模式第一個字符匹配或者'.'匹配,那麼字符串和模式都後移一個字符,然後匹配剩餘
if len(str)>0 and (str[0]==pattern[0] or str[0]=="."):
return self.re_match(str[1:], pattern[1:])
# 2.如果字符串的第一位與pattern中的第一位都不匹配,直接返回False
return False
if __name__=="__main__":
str = "aaa"
pattern = "ab*a"
solution = Solution()
result = solution.re_match(str, pattern)
print(result)