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.lengthstr2.lengthstr1andstr2consist 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.
import java.util.*;public class DistinctSubsequences{public static int numberOfSubsequences(String str1, String 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 ...