- 跳跃游戏 VII
给你一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump 。一开始,你在下标 0 处,且该位置的值一定为 ‘0’ 。当同时满足如下条件时,你可以从下标 i 移动到下标 j 处:
i + minJump <= j <= min(i + maxJump, s.length - 1) 且
s[j] == '0'.
如果你可以到达 s 的下标 s.length - 1 处,请你返回 true ,否则返回 false 。
前缀和+动态规划
某一处是否能到达,取决于前面[minJump,maxJump]这一范围内,是否有可以到达的。因此可以借助动态规划的思想。
前缀和的思想体现在,使用数组存储截止到某一位置,所有可以到达的点的个数,这样一个范围内有没有点可以到达,就直接用presum[i-minJump]-presum[i-maxJump-1]计算得到。
class Solution {
public:
bool canReach(string s, int minJump, int maxJump) {
int n=s.size();
vector<bool>f(n);//动态规划数组
vector<int>presum(n,1);
for(int i=minJump;i<n;i++){
if(s[i]=='0'){
int l=i-maxJump,r=i-minJump;
if((presum[r]-(l<=0?0:presum[l-1]))>0){
f[i]=true;
}
}
presum[i]=presum[i-1]+f[i];
}
return f[n-1];
}
};