Skip to main content

Wildcard Matching

Problem statement

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 1:

Input: s = "aa", p = "a"Output: falseExplanation: "a" does not match the entire string "aa".

Example 2:

Input: s = "aa", p = "*"Output: trueExplanation: '*' matches any sequence.

Example 3:

Input: s = "cb", p = "?a"Output: falseExplanation: '?' matches 'c', but the second letter is 'a', which does not match 'b'.

Constraints:

  • 0 <= s.length, p.length <= 2000
  • s contains only lowercase English letters.
  • p contains only lowercase English letters, '?' or '*'.

My solution

/**
* @param {string} s
* @param {string} p
* @return {boolean}
*/
var isMatch = function(s, p) {
// const regExp = new RegExp(`^${p.replace(/\?/g, "\\w").replace(/[*]+/g, "(?:.+)?")}$`)
// console.log("regExp", regExp)
// return Array.isArray(s.match(regExp))


let lenS = s.length;
let lenP = p.length;
let i = 0;
let j = 0;
let startIndex = -1;
let startMatchIndex = -1;

while (i < lenS) {
if (s.charAt(i) === p.charAt(j) || p.charAt(j) === "?") {
i++;
j++
} else if(p.charAt(j) === "*") {
startIndex = j;
startMatchIndex = i;
j++
} else if(startIndex !== -1) {
i = startMatchIndex + 1;
j = startIndex + 1;
startMatchIndex = i;
} else {
return false
}
}

while (j < lenP && p[j] === "*") {
j++
}

return j === lenP;
};