文章目录
- 题目介绍
- 题解
题目介绍
题解
题意:每次可以爬 zero 或 one 个台阶,返回爬 low 到 high 个台阶的方案数。
和上题337.组合总和 (链接)的思路一样,只不过是将可以爬的台阶数从数组换成了两个数(zero和one)
代码如下:
class Solution {
public int countGoodStrings(int low, int high, int zero, int one) {
final int MOD = 1000000007;
int ans = 0;
int[] dp = new int[high + 1]; // dp[i] 表示构造长为 i 的字符串的方案数
dp[0] = 1; // 构造空串的方案数为 1
for (int i = 1; i <= high; i++) {
if (zero <= i) dp[i] = dp[i - zero] % MOD;
if (one <= i) dp[i] = (dp[i] + dp[i - one]) % MOD;
}
for (int i = low; i <= high; i++) {
ans = (ans + dp[i]) % MOD;
}
return ans;
}
}
简化代码:将两个for循环合并成一个
class Solution {
public int countGoodStrings(int low, int high, int zero, int one) {
final int MOD = 1000000007;
int ans = 0;
int[] dp = new int[high + 1]; // dp[i] 表示构造长为 i 的字符串的方案数
dp[0] = 1; // 构造空串的方案数为 1
for (int i = 1; i <= high; i++) {
if (i >= zero) dp[i] = dp[i - zero];
if (i >= one) dp[i] = (dp[i] + dp[i - one]) % MOD;
if (i >= low) ans = (ans + dp[i]) % MOD;
}
return ans;
}
}