Implement regular expression matching with support for '.' and ''. '.' Matches any single character. '' Matches zero or more of the preceding element. The matching should cover the entire input string not partial. The function prototype should be: bool ismatchconst char s, const char p Some examples: ismatchaa,a  false ismatchaa,aa  true ismatchaaa,aa  false ismatchaa, a  true ismatchaa, .  true ismatchab, .  true ismatchaab, cab  true Finds if stra matches strb Keyword arguments: stra  string strb  string Match empty string with empty pattern Match empty string with . The previous character has matched and the current one has to be matched. Two possible matches: the same or . Horizontal look up j  2. Not use the character before . Vertical look up i  1. Use at least one character before . p a b  s 1 0 0 0 a 0 1 0 1 b 0 0 1 1 b 0 0 0 ?
def is_match(str_a, str_b):
    """Finds if `str_a` matches `str_b`

    Keyword arguments:
    str_a -- string
    str_b -- string
    """
    len_a, len_b = len(str_a) + 1, len(str_b) + 1
    matches = [[False] * len_b  for _ in range(len_a)]

    # Match empty string with empty pattern
    matches[0][0] = True

    # Match empty string with .*
    for i, element in enumerate(str_b[1:], 2):
        matches[0][i] = matches[0][i - 2] and element == '*'

    for i, char_a in enumerate(str_a, 1):
        for j, char_b in enumerate(str_b, 1):
            if char_b != '*':
                # The previous character has matched and the current one
                # has to be matched. Two possible matches: the same or .
                matches[i][j] = matches[i - 1][j - 1] and \
                                char_b in (char_a, '.')
            else:
                # Horizontal look up [j - 2].
                # Not use the character before *.
                matches[i][j] |= matches[i][j - 2]

                # Vertical look up [i - 1].
                # Use at least one character before *.
                #   p a b *
                # s 1 0 0 0
                # a 0 1 0 1
                # b 0 0 1 1
                # b 0 0 0 ?
                if char_a == str_b[j - 2] or str_b[j - 2] == '.':
                    matches[i][j] |= matches[i - 1][j]

    return matches[-1][-1]
