10. Regular Expression Matching
Problem description:
Given an input string (s) and a pattern (p), implement regular expression matching with support for ‘.’ and ‘*’.
‘.’ Matches any single character.
‘*’ Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
Note:
s could be empty and contains only lowercase letters a-z.
p could be empty and contains only lowercase letters a-z, and characters like . or *.
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
Solution:
create dp array. dp[i][j] to be true if s[0..i) matches p[0..j)
If p[j] == s[i] : dp[i][j] = dp[i-1][j-1];
If the character on position j in string p is equal to the character on position i in string s.If p[j] == ‘.’ : dp[i][j] = dp[i-1][j-1];
If the character on position j in string p is a ‘.’, it can match any character, so dp[i][j] follow dp[i-1][j-1].If p[j] == ‘*’:
there are two sub conditions:- if p[j-1] != s[i] : dp[i][j] = dp[i][j-2] //in this case, $a*$ only counts as empty
- if p[j-1] == s[i] or p[j-1] == ‘.’:
dp[i][j] = dp[i-1][j] //in this case, $a*$ counts as multiple a
or dp[i][j] = dp[i][j-1] // in this case, $a*$ counts as single a
or dp[i][j] = dp[i][j-2] // in this case, $a*$ counts as empty
1 | class Solution: |
1 | class Solution { |
time complexity: $O(mn)$
space complexity: $O(mn)$
reference:
https://goo.gl/1yJRGK
https://goo.gl/sFR26t