2466. 统计构造好字符串的方案数
给你整数
zero
,one
,low
和high
,我们从空字符串开始构造一个字符串,每一步执行下面操作中的一种:
- 将
'0'
在字符串末尾添加zero
次。- 将
'1'
在字符串末尾添加one
次。以上操作可以执行任意次。
如果通过以上过程得到一个 长度 在
low
和high
之间(包含上下边界)的字符串,那么这个字符串我们称为 好 字符串。请你返回满足以上要求的 不同 好字符串数目。由于答案可能很大,请将结果对
109 + 7
取余 后返回。示例 1:
输入:low = 3, high = 3, zero = 1, one = 1 输出:8 解释: 一个可能的好字符串是 "011" 。 可以这样构造得到:"" -> "0" -> "01" -> "011" 。 从 "000" 到 "111" 之间所有的二进制字符串都是好字符串。示例 2:
输入:low = 2, high = 3, zero = 1, one = 2 输出:5 解释:好字符串为 "00" ,"11" ,"000" ,"110" 和 "011" 。提示:
1 <= low <= high <= 105
1 <= zero, one <= low
记忆化搜索:
class Solution {
int[] arr;
int zero=0;
int one=0;
int low=0;
int high=0;
public int countGoodStrings(int low, int high, int zero, int one) {
this.zero=zero;
this.one=one;
this.low=low;
this.high=high;
arr=new int[high+1];
Arrays.fill(arr,-1);
arr[0]=1;
long sum=0l;
for(int i=high;i>=low;i--){
sum+=(dfs(i)%1000000007);
}
return (int)(sum%1000000007);
}
public int dfs(int i){
if(i<0) return 0;
if(i>high) return 0;
if(arr[i]!=-1) return arr[i];
int answer=dfs(i-zero)+dfs(i-one);
arr[i]=answer%1000000007;
return answer%1000000007;
}
}
动态规划:
class Solution {
public int countGoodStrings(int low, int high, int zero, int one) {
long[] dp=new long[high+1];
dp[0]=1;
for(int i=1;i<=high;i++){
dp[i]=((i-zero<0?0l:dp[i-zero])+(i-one<0?0l:dp[i-one]))%1000000007;
}
long sum=0l;
for(int i=low;i<=high;i++){
sum+=dp[i]%1000000007;
}
return (int)(sum%1000000007);
}
}