LC115 - Distinct Subsequences
Problem
Given two strings s and t, return the number of distinct subsequences of s which equals t. The test cases are generated so that the answer fits on a 32-bit signed integer.
Example
Input: s = "rabbbit", t = "rabbit" Output: 3 Explanation: As shown below, there are 3 ways you can generate "rabbit" from s. ==rabb==b==it== ==ra==b==bbit== ==rab==b==bit==
Solution
Cached DFS
Intuitively, use two pointers, one for each string s and t to check whether or not t is a subsequence of s. More or less, we're just checking if s[i] is equal to t[j], and incrementing i and j, and if not, incrementing i to see if the next character is equal to t[j]. Time and space complexity of this approach is .
def numDistinct(self, s: str, t: str) -> int:
@cache
def dfs(i, j):
# end reached, 1 distinct value found
if j == len(t):
return 1
# end of s reached without reaching t, no distinct value found
if i == len(s):
return 0
tmp = dfs(i+1)
if s[i] == t[j]:
tmp += dfs(i+1, j+1)
return tmp
return dfs(0,0)Last updated