Skip to content

Commit 39c42d7

Browse files
committed
feat: regular-expression-matching-dp challenge
1 parent 3e532c0 commit 39c42d7

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Challenge: Design a regular expression matching engine that supports special characters like '.' and '*',
2+
# using dynamic programming techniques to efficiently handle branching and backtracking.
3+
# Use object-oriented programming and follow the DRY principle.
4+
5+
from regex_matcher import RegexMatcher
6+
7+
def main():
8+
text = "aab"
9+
pattern = "c*a*b"
10+
matcher = RegexMatcher(text, pattern)
11+
result = matcher.is_match()
12+
print(f"Text: {text}")
13+
print(f"Pattern: {pattern}")
14+
print(f"Match result: {result}")
15+
16+
if __name__ == "__main__":
17+
main()
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class RegexMatcher:
2+
def __init__(self, text: str, pattern: str):
3+
self.text = text
4+
self.pattern = pattern
5+
self.dp = [[False] * (len(pattern) + 1) for _ in range(len(text) + 1)]
6+
7+
def is_match(self) -> bool:
8+
self.dp[0][0] = True
9+
10+
for j in range(2, len(self.pattern) + 1):
11+
if self.pattern[j - 1] == '*':
12+
self.dp[0][j] = self.dp[0][j - 2]
13+
14+
def matches(i, j):
15+
if self.pattern[j - 1] == '.' or self.pattern[j - 1] == self.text[i - 1]:
16+
return self.dp[i - 1][j - 1]
17+
if self.pattern[j - 1] == '*':
18+
zero = self.dp[i][j - 2]
19+
one_or_more = (
20+
(self.pattern[j - 2] == '.' or self.pattern[j - 2] == self.text[i - 1])
21+
and self.dp[i - 1][j]
22+
)
23+
return zero or one_or_more
24+
return False
25+
26+
for i in range(1, len(self.text) + 1):
27+
for j in range(1, len(self.pattern) + 1):
28+
self.dp[i][j] = matches(i, j)
29+
30+
return self.dp[len(self.text)][len(self.pattern)]

0 commit comments

Comments
 (0)