Input: minLength =2, maxLength =3, oneGroup =1, zeroGroup =2Output: 5Explanation: There are 5 good binary strings inthis example:"00","11","001","100", and "111".It can be proven that there are only 5 good strings satisfying all conditions.
Example 2:
1
2
3
4
Input: minLength =4, maxLength =4, oneGroup =4, zeroGroup =3Output: 1Explanation: There is only 1 good binary string inthis example:"1111".It can be proven that there is only 1 good string satisfying all conditions.
We build good binary strings by appending blocks of 1’s (length multiple of oneGroup) and blocks of 0’s (length multiple of zeroGroup). Use DP: dp[i] = number of good strings of length i ending with either 0 or 1 block.
#include<vector>usingnamespace std;
classSolution {
public:int goodBinaryStrings(int minLength, int maxLength, int oneGroup, int zeroGroup) {
constint MOD =1e9+7;
vector<int> dp(maxLength+1, 0);
dp[0] =1;
for (int i =1; i <= maxLength; ++i) {
if (i >= oneGroup) dp[i] = (dp[i] + dp[i-oneGroup]) % MOD;
if (i >= zeroGroup) dp[i] = (dp[i] + dp[i-zeroGroup]) % MOD;
}
int ans =0;
for (int i = minLength; i <= maxLength; ++i) ans = (ans + dp[i]) % MOD;
return ans;
}
};
classSolution {
publicintgoodBinaryStrings(int minLength, int maxLength, int oneGroup, int zeroGroup) {
int MOD = (int)1e9+7;
int[] dp =newint[maxLength+1];
dp[0]= 1;
for (int i = 1; i <= maxLength; ++i) {
if (i >= oneGroup) dp[i]= (dp[i]+ dp[i-oneGroup]) % MOD;
if (i >= zeroGroup) dp[i]= (dp[i]+ dp[i-zeroGroup]) % MOD;
}
int ans = 0;
for (int i = minLength; i <= maxLength; ++i) ans = (ans + dp[i]) % MOD;
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classSolution {
fungoodBinaryStrings(minLength: Int, maxLength: Int, oneGroup: Int, zeroGroup: Int): Int {
val MOD = 1_000_000_007
val dp = IntArray(maxLength+1)
dp[0] = 1for (i in1..maxLength) {
if (i >= oneGroup) dp[i] = (dp[i] + dp[i-oneGroup]) % MOD
if (i >= zeroGroup) dp[i] = (dp[i] + dp[i-zeroGroup]) % MOD
}
var ans = 0for (i in minLength..maxLength) ans = (ans + dp[i]) % MOD
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution:
defgoodBinaryStrings(self, minLength: int, maxLength: int, oneGroup: int, zeroGroup: int) -> int:
MOD =10**9+7 dp = [0]*(maxLength+1)
dp[0] =1for i in range(1, maxLength+1):
if i >= oneGroup:
dp[i] = (dp[i] + dp[i-oneGroup]) % MOD
if i >= zeroGroup:
dp[i] = (dp[i] + dp[i-zeroGroup]) % MOD
return sum(dp[minLength:maxLength+1]) % MOD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
impl Solution {
pubfngood_binary_strings(min_length: i32, max_length: i32, one_group: i32, zero_group: i32) -> i32 {
let min_length = min_length asusize;
let max_length = max_length asusize;
let one_group = one_group asusize;
let zero_group = zero_group asusize;
let m =1_000_000_007;
letmut dp =vec![0; max_length+1];
dp[0] =1;
for i in1..=max_length {
if i >= one_group { dp[i] = (dp[i] + dp[i-one_group]) % m; }
if i >= zero_group { dp[i] = (dp[i] + dp[i-zero_group]) % m; }
}
letmut ans =0;
for i in min_length..=max_length { ans = (ans + dp[i]) % m; }
ans
}
}