Backtracking is trying out all possibilities using recursion, exactly like bruteforce.
Suppose you have to make a series of decisions, among various choices, where :
* You don’t have enough information to know what to choose
* Each decision leads to a new set of choices
* Some sequence of choices (possibly more than one) may be a solution to your problem
Backtracking is a methodical way of trying out various sequences of decisions, until you find one that “works”.
Lets look at an example to explain this further.
Given a maze, find if a path from start to finish
At each intersection, you have to decide between three or fewer choices:
* Go straight
* Go left
* Go right
You don’t have enough information to choose correctly. Each choice leads to another set of choices. One or more sequences of choices may (or may not) lead to a solution.
So, you explore each option thoroughly and once you cannot find a solution using the option selected, you come back and try one of the remaining options.
Backtracking Pseudocode
A pseudocode for the above question would be :
boolean pathFound(Position p) {
if (p is finish) return true;
foreach option O from p {
boolean isThereAPath = pathFound(O);
if (isThereAPath) return true; // We found a path using option O
}
// We have tried all options from this position and none of the options lead to finish.
// Hence there is no solution possible to finish
return false;
}
In general, the usual pseudocode for any backtracking solution is :
boolean solve(Node n) {
if n is a goal node, return true
foreach option O possible from n {
if solve(O) succeeds, return true
}
return false
}
Now, head over to the assignments, and try out some of the problems. Most of them involve backtracking.
Problem | Score | Companies | Time | Status |
---|---|---|---|---|
All Possible Combinations | 200 |
|
38:29 | |
Subset | 250 |
|
61:56 | |
Combination Sum | 300 |
|
62:41 | |
Combination Sum II | 300 |
|
42:05 | |
Combinations | 300 |
|
46:09 | |
Subsets II | 300 |
|
41:22 |
Problem | Score | Companies | Time | Status |
---|---|---|---|---|
Maximal String | 200 |
|
65:47 | |
Kth Permutation Sequence | 350 |
|
79:14 | |
Gray Code | 350 |
|
58:58 |
Problem | Score | Companies | Time | Status |
---|---|---|---|---|
Letter Phone | 250 |
|
53:36 | |
Palindrome Partitioning | 300 |
|
68:22 | |
Generate all Parentheses II | 350 |
|
52:54 |
Problem | Score | Companies | Time | Status |
---|---|---|---|---|
Permutations | 350 |
|
39:38 |