Question
Given a string S and a string T, count the number of distinct subsequences of T in S.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, “ACE” is a subsequence of “ABCDE” while “AEC” is not).
Here is an example:
S = “rabbbit”, T = “rabbit”
Return 3.
the first try
class Solution(object):
def numDistinct(self, s, t):
"""
:type s: str
:type t: str
:rtype: int
"""
res = [0]*(len(t)+1)
res[0] = 1
for inds in range(len(s)):
for indt in range(len(t)):
res[indt+1] = res[indt+1] if t[indt]!=s[inds] else res[indt+1]+res[indt]
return res[-1]
Wrong case
Input: "ddd", "dd"
Output: 6
Expected: 3
Solution
m= len(t), n=len(s)
Time complexity: O(m*n)
space complexity: O(m)
Get idea from here1, here2, and here3.
Analysis
res[i][j] means the number of sequence of the first i elem iof T in
Code
class Solution(object):
def numDistinct(self, s, t):
"""
:type s: str
:type t: str
:rtype: int
"""
res = [0]*(len(t)+1)
res[0] = 1
for inds in range(len(s)):
for indt in range(len(t)-1,-1,-1):
res[indt+1] = res[indt+1] if t[indt]!=s[inds] else res[indt+1]+res[indt]
return res[-1]
Take home message
For dp, save space from 2d list -> two list -> one list. This is a good example.