"""
Given two strings, an input string and a pattern,
this program checks if the input string matches the pattern.

Example :
input_string = "baaabab"
pattern = "*****ba*****ab"
Output: True

This problem can be solved using the concept of "DYNAMIC PROGRAMMING".

We create a 2D boolean matrix, where each entry match_matrix[i][j] is True
if the first i characters in input_string match the first j characters
of pattern. We initialize the first row and first column based on specific
rules, then fill up the rest of the matrix using a bottom-up dynamic
programming approach.

The amount of match that will be determined is equal to match_matrix[n][m]
where n and m are lengths of the input_string and pattern respectively.

"""


def is_pattern_match(input_string: str, pattern: str) -> bool:
    """
    >>> is_pattern_match('baaabab','*****ba*****ba')
    False
    >>> is_pattern_match('baaabab','*****ba*****ab')
    True
    >>> is_pattern_match('aa','*')
    True
    """

    input_length = len(input_string)
    pattern_length = len(pattern)

    match_matrix = [[False] * (pattern_length + 1) for _ in range(input_length + 1)]

    match_matrix[0][0] = True

    for j in range(1, pattern_length + 1):
        if pattern[j - 1] == "*":
            match_matrix[0][j] = match_matrix[0][j - 1]

    for i in range(1, input_length + 1):
        for j in range(1, pattern_length + 1):
            if pattern[j - 1] in ("?", input_string[i - 1]):
                match_matrix[i][j] = match_matrix[i - 1][j - 1]
            elif pattern[j - 1] == "*":
                match_matrix[i][j] = match_matrix[i - 1][j] or match_matrix[i][j - 1]
            else:
                match_matrix[i][j] = False

    return match_matrix[input_length][pattern_length]


if __name__ == "__main__":
    import doctest

    doctest.testmod()

    print(f"{is_pattern_match('baaabab','*****ba*****ab')}")