LeetCode 940 Dynamic Programming Solution After LeetCode 115

It's very interesting. LeetCode has given us a second Hard Dynamic problem for the Daily Challenge in a row. Yesterday, it was 115. Distinct Subsequences problem. I posted the solution here. Today it is 940. Distinct Subsequences II

Below are implementations of the Time O(n) and Space O(1) solution in several programming languages: C++, Java, JavaScript, TypeScript, Python.


LeetCode 940 C++ solution

class Solution {
public:
  int distinctSubseqII(string s) {
    const int MOD = 1e9 + 7;

    long long dp = 1;
    long long last[26] = {};

    for(char c : s)
    {
      int index = c - 'a';

      long long prevDp = dp;

      dp = (2 * dp - last[index] + MOD) % MOD;

      last[index] = prevDp;
    }

    return (dp - 1 + MOD) % MOD;
  }
};

LeetCode 940 Java solution

class Solution {
  public int distinctSubseqII(String s) {
    final long MOD = 1_000_000_007L;

    long dp = 1;
    long[] last = new long[26];

    for(char c : s.toCharArray()) {
      int idx = c - 'a';
      long prevDp = dp;

      dp = (2 * dp - last[idx] + MOD) % MOD;

      last[idx] = prevDp;
    }

    return (int) ((dp - 1 + MOD) % MOD);
  }
}

LeetCode 940 JavaScript solution

var distinctSubseqII = function(s) {
  const MOD = 1e9 + 7;

  let dp = 1;
  const last = new Array(26).fill(0);

  for(const c of s) {
    const idx = c.charCodeAt(0) - 97;
    const prevDp = dp;

    dp = (2 * dp - last[idx] + MOD) % MOD;

    last[idx] = prevDp;
  }

  return (dp - 1 + MOD) % MOD;
};

LeetCode 940 TypeScript solution

function distinctSubseqII(s: string): number {
  const MOD = 1e9 + 7;

  let dp = 1;
  const last: number[] = new Array(26).fill(0);

  for(const c of s) {
    const idx = c.charCodeAt(0) - 97;

    const prevDp = dp;

    dp = (2 * dp - last[idx] + MOD) % MOD;

    last[idx] = prevDp;
  }

  return (dp - 1 + MOD) % MOD;
};

LeetCode 940 Python solution

class Solution(object):
  def distinctSubseqII(self, s):
    MOD = 10**9 + 7

    dp = 1
    last = [0] * 26

    for c in s:
      idx = ord(c) - ord('a')

      prev_dp = dp

      dp = (2 * dp - last[idx] + MOD) % MOD

      last[idx] = prev_dp

  return (dp - 1 + MOD) % MOD