Skip to content

Link to Question

HARD

Wildcard Matching

Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '?' and '*' where:

  • '?' Matches any single character.
  • '*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

Example

Input:

s = "aa", p = "a*"

Output:

true

Explanation:
The pattern matches the entire string.


Constraints

  • 0 ≤ s.length, p.length ≤ 2000
  • s and p consist of only lowercase English letters and characters '?' and '*'.

Solution: Dynamic Programming

  • Time Complexity: O(m * n), where m = s.length, n = p.length
  • Space Complexity: O(m * n)
C++
class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.size(), n = p.size();
        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
        dp[0][0] = true;
        for (int j = 1; j <= n; ++j)
            if (p[j - 1] == '*') dp[0][j] = dp[0][j - 1];
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (p[j - 1] == '*')
                    dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
                else if (p[j - 1] == '?' || s[i - 1] == p[j - 1])
                    dp[i][j] = dp[i - 1][j - 1];
            }
        }
        return dp[m][n];
    }
};