Suppose we have a string s and a regular expression pattern. We have to check whether the given pattern matches with given string or not. In the regular expression, there are few rules −
. (period) which matches any single character
* (asterisk) which matches zero or more of the preceding element.
So, if the input is like pattern = "h.l*o" s = "hello", then the output will be True, as We have ra and then a single character
To solve this, we will follow these steps −
n := size of s
m := size of p
Define a function dp() . This will take i, j
if j is same as m, then
return i is same as n
match := true when (i < n and(s[i] is same as p[j] or p[j] is same as ".") otherwise false
if j + 1 & m and p[j + 1] is same as "*", then
return true when dp(i, j + 2) or (match and dp(i + 1, j)) otherwise false
return match and dp(i + 1, j + 1)
From the main method return dp(0, 0)
Example
Let us see the following implementation to get better understanding −
class Solution: def solve(self, p, s): n = len(s) m = len(p) def dp(i, j): if j == m: return i == n match = i < n and (s[i] == p[j] or p[j] == ".") if j + 1 < m and p[j + 1] == "*": return dp(i, j + 2) or (match and dp(i + 1, j)) return match and dp(i + 1, j + 1) return dp(0, 0) ob = Solution() pattern = "h.l*o" s = "hello" print(ob.solve(pattern, s))
Input
"h.l*o", "hello"
Output
True