10. Regular Expression Matching
Description
Given an input string s
and a pattern p
, implement regular expression matching with support for '.'
and '*'
where:
'.'
Matches any single character.'*'
Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
Example 1:
Input: s = "aa", p = "a" Output: false Explanation: "a" does not match the entire string "aa".
Example 2:
Input: s = "aa", p = "a*" Output: true Explanation: '*' means zero or more of the preceding element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".
Example 3:
Input: s = "ab", p = ".*" Output: true Explanation: ".*" means "zero or more (*) of any character (.)".
Constraints:
1 <= s.length <= 20
1 <= p.length <= 20
s
contains only lowercase English letters.p
contains only lowercase English letters,'.'
, and'*'
.- It is guaranteed for each appearance of the character
'*'
, there will be a previous valid character to match.
Solutions
Solution: Recursion
- Time complexity: O(mn)
- Space complexity: O(mn)
JavaScript
js
/**
* @param {string} s
* @param {string} p
* @return {boolean}
*/
const isMatch = function (s, p) {
const hashMap = new Map();
const checkRegex = (index, j) => {
const cacheKey = `${index},${j}`;
if (hashMap.has(cacheKey)) return hashMap.get(cacheKey);
if (j === p.length) return index === s.length;
const isFirstMatch = index < s.length && (s[index] === p[j] || p[j] === '.');
const isCheckPreceding = j + 1 < p.length && p[j + 1] === '*';
const result = isCheckPreceding
? checkRegex(index, j + 2) || (isFirstMatch && checkRegex(index + 1, j))
: isFirstMatch && checkRegex(index + 1, j + 1);
hashMap.set(cacheKey, result);
return result;
};
return checkRegex(0, 0);
};