10. 正则表达式匹配

    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        m = len(p) + 1
        n = len(s) + 1
        res = [[False] * n for _ in range(m)]
        
        # 初始化
        res[0][0] = True
        for j in range(1, n):
            res[0][j] = False
        # 如果是'*',和往前两位一致
        for i in range(2, m):
            if p[i-1] == '*':
                res[i][0] = res[i-2][0]
        
        
        for i in range(1, m):
            for j in range(1, n):
                if p[i-1] in [s[j-1],'.']:
                    res[i][j] = res[i-1][j-1]
                elif p[i-1] == '*':
                    # 分两种情况: *用于代表0个 和 * 代表多个
                    # "a" 和 "c*a*":一致的要求是 'c*'和''一致 且 'a'和'a*'一致
                    if res[i-2][j]:
                        res[i][j] = True
                    # 'ba'和'bc*a*'一致的要求是 'ba'的最后一个'a'和'bc*a*'中的'a'一致
                    # 且 'b'和'bc*a*'一致 (容易出错的地方)
                    if p[i-2] in [s[j-1],'.'] and res[i][j-1]:
                        res[i][j] = True
        return res[-1][-1]

你可能感兴趣的:(10. 正则表达式匹配)