All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0901_1000.s0940_distinct_subsequences_ii.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0901_1000.s0940_distinct_subsequences_ii;

// #Hard #String #Dynamic_Programming #2022_03_30_Time_2_ms_(99.41%)_Space_40.3_MB_(98.22%)

/**
 * 940 - Distinct Subsequences II\.
 *
 * Hard
 *
 * Given a string s, return _the number of **distinct non-empty subsequences** of_ `s`. Since the answer may be very large, return it **modulo** 109 + 7.
 *
 * A **subsequence** of a string is a new string that is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (i.e., `"ace"` is a subsequence of `"abcde"` while `"aec"` is not.
 *
 * **Example 1:**
 *
 * **Input:** s = "abc"
 *
 * **Output:** 7
 *
 * **Explanation:** The 7 distinct subsequences are "a", "b", "c", "ab", "ac", "bc", and "abc".
 *
 * **Example 2:**
 *
 * **Input:** s = "aba"
 *
 * **Output:** 6
 *
 * **Explanation:** The 6 distinct subsequences are "a", "b", "ab", "aa", "ba", and "aba".
 *
 * **Example 3:**
 *
 * **Input:** s = "aaa"
 *
 * **Output:** 3
 *
 * **Explanation:** The 3 distinct subsequences are "a", "aa" and "aaa".
 *
 * **Constraints:**
 *
 * *   `1 <= s.length <= 2000`
 * *   `s` consists of lowercase English letters.
**/
public class Solution {
    public int distinctSubseqII(String str) {
        int m = (int) (1e9) + 7;
        int prev = 1;
        int[] subseqAtPrevIndexOfMyLastOcc = new int[26];
        for (int i = 1; i <= str.length(); i++) {
            int crntStrIdx = i - 1;
            int subtract = subseqAtPrevIndexOfMyLastOcc[str.charAt(crntStrIdx) - 'a'];
            int curr = (2 * prev) % m;
            curr = (curr + m - subtract) % m;
            subseqAtPrevIndexOfMyLastOcc[str.charAt(crntStrIdx) - 'a'] = prev;
            prev = curr;
        }
        return prev - 1;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy