[Add] : Wildcard Matching program under DYNAMIC PROGRAMMING
diff --git a/dynamic_programming/wildcard_matching.py b/dynamic_programming/wildcard_matching.py
new file mode 100644
index 000000000000..4ffc4b5d46aa
--- /dev/null
+++ b/dynamic_programming/wildcard_matching.py
@@ -0,0 +1,62 @@
+"""
+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')}")

### Describe your change:

This PR adds the wildcard matching program under dynamic programming.

Wildcard Matching : 

![image](https://github.com/TheAlgorithms/Python/assets/118645569/a92449af-3b0b-4f82-8a90-965c438bda51)

![wildcard-pattern-matching](https://github.com/TheAlgorithms/Python/assets/118645569/426c6487-d12e-4d73-ae04-7520bc1e2cda)

* [x] Add an algorithm?
* [ ] Fix a bug or typo in an existing algorithm?
* [ ] Documentation change?

### Checklist:
* [x] I have read [CONTRIBUTING.md](https://github.com/TheAlgorithms/Python/blob/master/CONTRIBUTING.md).
* [x] This pull request is all my own work -- I have not plagiarized.
* [x] I know that pull requests will not be merged if they fail the automated tests.
* [x] This PR only changes one algorithm file.  To ease review, please open separate PRs for separate algorithms.
* [x] All new Python files are placed inside an existing directory.
* [x] All filenames are in all lowercase characters with no spaces or dashes.
* [x] All functions and variable names follow Python naming conventions.
* [x] All function parameters and return values are annotated with Python [type hints](https://docs.python.org/3/library/typing.html).
* [x] All functions have [doctests](https://docs.python.org/3/library/doctest.html) that pass the automated testing.
* [ ] All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
* [x] If this pull request resolves one or more open issues then the description above includes the issue number(s) with a [closing keyword](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue): "Fixes #ISSUE-NUMBER".
