Count Ways To Build Good Strings

medium dp

Problem

At each step, append either zero '0's or one '1's. Count strings whose final length is in [low, high], modulo 10^9 + 7.

Inputlow = 3, high = 3, zero = 1, one = 1
Output8
Each position has two choices, total 2^3 = 8 strings of length 3.

def count_good_strings(low, high, zero, one):
    MOD = 10**9 + 7
    dp = [0] * (high + 1)
    dp[0] = 1
    ans = 0
    for i in range(1, high + 1):
        if i - zero >= 0:
            dp[i] = (dp[i] + dp[i - zero]) % MOD
        if i - one >= 0:
            dp[i] = (dp[i] + dp[i - one]) % MOD
        if i >= low:
            ans = (ans + dp[i]) % MOD
    return ans
function countGoodStrings(low, high, zero, one) {
  const MOD = 1000000007n;
  const dp = new Array(high + 1).fill(0n);
  dp[0] = 1n;
  let ans = 0n;
  for (let i = 1; i <= high; i++) {
    if (i - zero >= 0) dp[i] = (dp[i] + dp[i - zero]) % MOD;
    if (i - one >= 0) dp[i] = (dp[i] + dp[i - one]) % MOD;
    if (i >= low) ans = (ans + dp[i]) % MOD;
  }
  return Number(ans);
}
class Solution {
    public int countGoodStrings(int low, int high, int zero, int one) {
        int MOD = 1_000_000_007;
        long[] dp = new long[high + 1];
        dp[0] = 1;
        long ans = 0;
        for (int i = 1; i <= high; i++) {
            if (i - zero >= 0) dp[i] = (dp[i] + dp[i - zero]) % MOD;
            if (i - one >= 0) dp[i] = (dp[i] + dp[i - one]) % MOD;
            if (i >= low) ans = (ans + dp[i]) % MOD;
        }
        return (int) ans;
    }
}
int countGoodStrings(int low, int high, int zero, int one) {
    const int MOD = 1'000'000'007;
    vector<long long> dp(high + 1, 0);
    dp[0] = 1;
    long long ans = 0;
    for (int i = 1; i <= high; i++) {
        if (i - zero >= 0) dp[i] = (dp[i] + dp[i - zero]) % MOD;
        if (i - one >= 0) dp[i] = (dp[i] + dp[i - one]) % MOD;
        if (i >= low) ans = (ans + dp[i]) % MOD;
    }
    return (int) ans;
}
Time: O(high) Space: O(high)