Regular Expression Matching

Posted by Bill on March 11, 2023

Regular Expression Matching

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).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 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 (.)".
 Example 4:

 Input: s = "aab", p = "c*a*b"
 Output: true
 Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore, it matches "aab".
 Example 5:

 Input: s = "mississippi", p = "mis*is*p*."
 Output: false


  Constraints:

  1 <= s.length <= 20
  1 <= p.length <= 30
  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.

C++ Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
  public:
    bool isMatch(string s, string p) {
      if (p.length() == 0) {
          return s.length() == 0 ? true : false;
      }
      bool first_match = false;
      if (s.length() > 0 && (p[0] == '.' || p[0] == s[0])) {
          first_match = true;
      }
      if (p.length() >= 2 && p[1] == '*') {
          return isMatch(s, p.substr(2)) || (first_match && isMatch(s.substr(1), p));
      } else {
          return first_match && isMatch(s.substr(1), p.substr(1));
      }
    }
}