Skip to content

Commit 4b39be0

Browse files
committed
Add problem 97 - Interleaving String
1 parent 138173a commit 4b39be0

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class InterleavingString:
2+
def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
3+
# Lengths of the strings
4+
m, n = len(s1), len(s2)
5+
# Special case
6+
if m + n != len(s3):
7+
return False
8+
# Lookup table to store if s3[0...k] can be formed by s1[0...i] and
9+
# s2[0...j]
10+
lookup = [[False] * (n + 1) for _ in range(m + 1)]
11+
# For empty strings
12+
lookup[0][0] = True
13+
# If s2 is empty
14+
for i in range(1, m + 1):
15+
lookup[i][0] = lookup[i - 1][0] and s1[i - 1] == s3[i - 1]
16+
# If s1 is empty
17+
for j in range(1, n + 1):
18+
lookup[0][j] = lookup[0][j - 1] and s2[j - 1] == s3[j - 1]
19+
# Populate the remaining table
20+
for i in range(1, m + 1):
21+
for j in range(1, n + 1):
22+
lookup[i][j] = (lookup[i - 1][j] and s1[i - 1] == s3[i + j - 1]) or (
23+
lookup[i][j - 1] and s2[j - 1] == s3[i + j - 1])
24+
25+
return lookup[m][n]
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import unittest
2+
3+
from problems.dynamic_programming.interleaving_string import InterleavingString
4+
5+
6+
class TestInterleavingString(unittest.TestCase):
7+
8+
def setUp(self):
9+
self.interleaving_string = InterleavingString()
10+
11+
def test_interleave(self):
12+
self.assertTrue(self.interleaving_string.isInterleave("aabcc", "dbbca", "aadbbcbcac"))
13+
self.assertFalse(self.interleaving_string.isInterleave("aabcc", "dbbca", "aadbbbaccc"))
14+
self.assertTrue(self.interleaving_string.isInterleave("", "", ""))
15+
self.assertTrue(self.interleaving_string.isInterleave("a", "", "a"))
16+
self.assertTrue(self.interleaving_string.isInterleave("", "b", "b"))
17+
self.assertFalse(self.interleaving_string.isInterleave("abc", "def", "abdccfe"))
18+
19+
def test_edge_cases(self):
20+
self.assertFalse(self.interleaving_string.isInterleave("abc", "def", "abcdefg"))
21+
self.assertTrue(self.interleaving_string.isInterleave("abc", "def", "adbcef"))
22+
self.assertFalse(self.interleaving_string.isInterleave("", "a", "b"))
23+
24+
25+
if __name__ == '__main__':
26+
unittest.main()

0 commit comments

Comments
 (0)