Distinct Subsequence Pattern Matching
Let's solve the Distinct Subsequence Pattern Matching problem using Dynamic Programming.
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.length
500 str1.length
str2.length
str1
andstr2
consist 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
, ...