1. Recursive Branching
Intuition
Recursively try jumping to every index j in [i + minJump, i + maxJump] where s[j] == 0.
Algorithm
- Define
solve(i). - If
i == n - 1, returntrue. - For
jfromi + minJumptomin(i + maxJump, n - 1): - If
s[j] == '0'andsolve(j)returns true, returntrue. - Return
false.
#include <iostream>#include <string>#include <algorithm> using namespace std; class Solution { bool solve(int i, const string& s, int minJump, int maxJump) { if (i == s.length() - 1) return true; int right = min((int)s.length() - 1, i + maxJump); for (int j = i + minJump; j <= right; ++j) { if (s[j] == '0' && solve(j, s, minJump, maxJump)) { return true; } } return false; }public: bool canReach(string s, int minJump, int maxJump) { if (s.back() != '0') return false; return solve(0, s, minJump, maxJump); }}; int main() { Solution sol; cout << (sol.canReach("011010", 2, 3) ? "true" : "false") << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) call stack