Distinct Subsequence Pattern Matching
Let's solve the Distinct Subsequence Pattern Matching problem using Dynamic Programming.
We'll cover the following...
Statement
Given two strings, str1 and str2, return the number of times str2 appears in str1 as a subsequence.
Note: A string is a subsequence of string if deleting some number of characters from results in the string .
Let’s assume that you have two strings as follows:
- str1 = "bbagbag"
- str2 = "bag"
In this example, str2 appears  times in str1 as a subsequence:
- bbagbag
- bbagbag
- bbagbag
- bbagbag
- bbagbag
- bbagbag
- bbagbag
Constraints:
- 1  str1.length,str2.length500
- str1.length- str2.length
- str1and- str2consist of lowercase English letters
Examples
| No. | str1 | str2 | Number of Subsequences | 
| 1 | "bbagbag" | "bag" | 7 | 
| 2 | "dawawg" | "aw" | 3 | 
Try it yourself
Implement your solution in the following playground.
def number_of_subsequences(str1, str2):# your code will replace the placeholder return statement belowreturn -1
Note: If you clicked the “Submit” button and the code timed out, this means that your solution needs to be optimized in terms of running time.
Hint: Use dynamic programming and see the magic.
Solution
We will first explore the naive recursive solution to this problem and then see how it can be improved using the Longest Common Substring dynamic programming pattern.
Naive approach
The naive approach is to find all possible subsequences in str1 and check if they contain str2. For this, we make the first call to the recursive function with both the pointers, i1 and i2, pointing to the  characters of str1 and str2, respectively. Then, in each subsequent recursive call to the function, i1 ...