2466. Count Ways To Build Good Strings
- Hardness: \(\color{orange}\textsf{Medium}\)
- Ralated Topics:
Dynamic Programming
- \(\color{blue}\textsf{Biweekly Contest 91}\)
一、題目
Given the integers zero
, one
, low
, and high
, we can construct a string by starting with an empty string, and then at each step perform either of the following:
- Append the character
'0'
zero
times. - Append the character
'1'
one
times. This can be performed any number of times. A good string is a string constructed by the above process having a length betweenlow
andhigh
(inclusive). Return the number of different good strings that can be constructed satisfying these properties. Since the answer can be large, return it modulo10^9 + 7
.
Example 1:
- Input: low = 3, high = 3, zero = 1, one = 1
- Output: 8
- Explanation: One possible valid good string is “011”.
It can be constructed as follows: "" -> “0” -> “01” -> “011”.
All binary strings from “000” to “111” are good strings in this example.
Example 2:
- Input: low = 2, high = 3, zero = 1, one = 2
- Output: 5
- Explanation: The good strings are “00”, “11”, “000”, “110”, and “011”.
Constraints:
1 <= low <= high <= 10^5
1 <= zero, one <= low
二、分析
- 這一題與 322. Coin Change 有異曲同工之妙。
- 這一題動態規劃是不定序列型框架的題型:
dp[n]
設為組成長度為n
的 string 的可能性,最後再將符合題目需求的dp[low]
到dp[high]
加起來。dp[n] = sum(dp[n-nums[i]])
。
三、解題
1. DP
- Time complexity: \(O(n)\)
- Space complexity: \(O(n)\)
int countGoodStrings(int low, int high, int zero, int one) {
vector<int> dp(high+1, 0);
int res = 0;
dp[0] = 1;
int start = min(zero, one);
for (int i = start; i <= high; i++) {
if (i-zero >= 0) dp[i] = (dp[i] + dp[i-zero]) % modulo;
if (i-one >= 0) dp[i] = (dp[i] + dp[i-one]) % modulo;
if (i >= low) res = (res + dp[i]) % modulo;
}
return res;
}