Skip to content

Commit 74b073e

Browse files
committed
Add problem 115 - Distinct Subsequences
1 parent 5c0fc80 commit 74b073e

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class DistinctSubsequences:
2+
@staticmethod
3+
def numDistinct(s: str, t: str) -> int:
4+
# Lengths of both strings
5+
m, n = len(s), len(t)
6+
# Lookup table to store count of distinct subsequences
7+
lookup = [[0 for j in range(n + 1)] for i in range(m + 1)]
8+
# If t is empty, it can be subsequence of every string but only once
9+
for i in range(m + 1):
10+
lookup[i][0] = 1
11+
# If both strings are empty
12+
lookup[0][0] = 1
13+
# Populate the remaining table
14+
for j in range(1, n + 1):
15+
for i in range(1, m + 1):
16+
lookup[i][j] = lookup[i - 1][j]
17+
# If characters are same
18+
if s[i - 1] == t[j - 1]:
19+
lookup[i][j] += lookup[i - 1][j - 1]
20+
return lookup[m][n]
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import unittest
2+
3+
from problems.dynamic_programming.distinct_subsequences import DistinctSubsequences
4+
5+
6+
class TestDistinctSubsequences(unittest.TestCase):
7+
8+
def setUp(self):
9+
self.distinct_subsequences = DistinctSubsequences()
10+
11+
def test_num_distinct_empty_strings(self):
12+
self.assertEqual(self.distinct_subsequences.numDistinct("", ""), 1)
13+
14+
def test_num_distinct_empty_target(self):
15+
self.assertEqual(self.distinct_subsequences.numDistinct("abc", ""), 1)
16+
17+
def test_num_distinct_empty_source(self):
18+
self.assertEqual(self.distinct_subsequences.numDistinct("", "abc"), 0)
19+
20+
def test_num_distinct_same_strings(self):
21+
self.assertEqual(self.distinct_subsequences.numDistinct("abc", "abc"), 1)
22+
23+
def test_num_distinct_general_cases(self):
24+
self.assertEqual(self.distinct_subsequences.numDistinct("babgbag", "bag"), 5)
25+
self.assertEqual(self.distinct_subsequences.numDistinct("rabbbit", "rabbit"), 3)
26+
self.assertEqual(self.distinct_subsequences.numDistinct("abc", "def"), 0)
27+
28+
29+
if __name__ == "__main__":
30+
unittest.main()

0 commit comments

Comments
 (0)