DDSA Solutions

Number of distinct subsequences

Time: O(n*m)
Space: O(n*m)
Advertisement

Intuition

DP: dp[i][j] = distinct subsequences of t[0..j-1] in s[0..i-1].

Algorithm

  1. 1dp[i][0] = 1 (empty subsequence). dp[0][j] = 0 for j>0.
  2. 2If s[i-1]==t[j-1]: dp[i][j] = dp[i-1][j-1] + dp[i-1][j].
  3. 3Else: dp[i][j] = dp[i-1][j].

Common Pitfalls

  • Can match with current char or skip it. Optimize to O(n) space with 1D array.
Number of distinct subsequences.java
Java
// Approach: DP. dp[i][j] = distinct subsequences of s[0..i-1] that equal t[0..j-1].
// Time: O(n*m) Space: O(n*m)
import java.util.*;

class Solution {
    static final int MOD = 1000000007;

    int distinctSubseq(String str) {
        int n = str.length();
        long[] dp = new long[n + 1];
        dp[0] = 1; // empty subsequence

        int[] last = new int[26];
        Arrays.fill(last, -1);

        for (int i = 1; i <= n; i++) {
            int ch = str.charAt(i - 1) - 'a';
            dp[i] = (2 * dp[i - 1]) % MOD;

            if (last[ch] != -1)
                dp[i] = (dp[i] - dp[last[ch]] + MOD) % MOD;

            last[ch] = i - 1;
        }

        return (int) dp[n];
    }
}
Advertisement
Was this solution helpful?