Java solution:
public static void main(String[] args) {
int[] nums1 = { 3, 4, 2, 3, 0, 3, 1, 2, 1 };
int[] nums2 = { 1, 0, 2, -3 };
int[] nums3 = { 0, 0, 0, 3};
int s = 3;
System.out.println(canReach0(nums1, s));
System.out.println(canReach0(nums2, s));
System.out.println(canReach0(nums3, s));
}
private static boolean canReach0(int[] nums, int s) {
Map<Integer, Boolean> map = new HashMap<>();
return dfs(nums, s, map);
}
private static boolean dfs(int[] nums, int s, Map<Integer, Boolean> map) {
if (s < 0 || s >= nums.length)
return false;
if (nums[s] == 0)
return true;
if (map.containsKey(s))
return map.get(s);
map.put(s, false);
if (s - nums[s] >= 0) {
if (dfs(nums, s - nums[s], map))
return true;
}
if (s + nums[s] < nums.length) {
if (dfs(nums, s + nums[s], map))
return true;
}
return false;
}
true
true
true