class Solution:
def canReach(self, s: str, minJump: int, maxJump: int) -> bool:
if s[-1] == '1': return False
zeroes = set([i for i in range(len(s)) if s[i] == '0'])
q = set([0])
while q:
cur = q.pop()
if cur == len(s) - 1: return True
for nxt in range(cur + minJump, min(cur + maxJump, len(s)) + 1):
if nxt in zeroes and nxt not in q:
q.add(nxt)
return False
class Solution:
def canReach(self, s: str, minJump: int, maxJump: int) -> bool:
def dp(pos):
if pos == len(s) - 1: return True
return s[pos] == '0' and any([dp(i) for i in range(pos + minJump, min(len(s), pos + maxJump + 1))])
if s[-1] == '1': return False
return dp(0)
class Solution:
def canReach(self, s: str, minJump: int, maxJump: int) -> bool:
n = len(s)
pres = [0] * n
dp = [0] * n
dp[0] = pres[0] = 1
for i in range(1, n):
l = i - maxJump - 1
r = i - minJump
dp[i] = s[i] == '0' and (0 if r < 0 else pres[r]) - (0 if l < 0 else pres[l]) > 0
pres[i] = pres[i-1] + dp[i]
return dp[-1]
from sortedcontainers import SortedList
class Solution:
def canReach(self, s: str, minJump: int, maxJump: int) -> bool:
if s[-1] == '1': return False
zeroes = SortedList([i for i in range(len(s)) if s[i] == '0'])
dp = [False] * len(s)
dp[0] = True
for i in range(len(s)):
if dp[i]:
l = zeroes.bisect_left(i + minJump)
r = zeroes.bisect_right(i + maxJump)
for v in [zeroes[i] for i in range(l, r)]:
dp[v] = True
zeroes.remove(v)
return dp[-1]