面試題19:正則表達式匹配

題目:請實現一個函數用來匹配包括'.'和'*'的正則表達式。模式中的字符'.'表示任意一個字符,而'*'表示它前面的字符可以出現任意次(包含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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章