Backtracking & Exhaustive Search
Advanced & DPCombinations, permutations, and constraint satisfaction through pruned search trees
117 problems·3 Easy·77 Medium·37 Hard
Pattern Study Guide & Cheat Sheet▼
Explore all combinatorial possibilities through depth-first recursion, systematically making a choice, exploring its consequences, and pruning or undoing the choice (backtracking).
Core Invariant: DFS on a Decision Tree: at each node: 1) Check base case; 2) Iterate over choices; 3) Prune invalid choices early; 4) Make choice; 5) Recurse; 6) Undo choice (restore state).
Recognize it (Keywords & Signals)
- Generate all permutations, combinations, or subsets
- Find all valid configurations (N-Queens, Sudoku)
- Word search in a 2D grid
- Generate parentheses
- Partition array into equal sum subsets
When NOT to use
Only the optimal value (count, min, max) is needed, not the actual paths/subsets (usually DP instead of backtracking!).
How to solve (Step-by-step)
- 1.Define `backtrack(start_idx, current_path)`.
- 2.Base case: if `current_path` meets length or target, add a deep copy `ans.append(list(current_path))` and return.
- 3.Loop through candidate elements from `start_idx` to `n`.
- 4.Pruning: skip if candidate exceeds remaining budget or is duplicate: `if i > start_idx and nums[i] == nums[i-1]: continue`.
- 5.Choose: `current_path.append(nums[i])`.
- 6.Recurse: `backtrack(i + 1, current_path)`.
- 7.Unchoose: `current_path.pop()`.
Watch for (Interview Traps)
- Appending `path` instead of `path.copy()` or `list(path)` (results in empty arrays after unchoose pops)
- Forgetting to sort before skipping duplicates (`nums[i] == nums[i-1]`)
- Incorrect recursion index: `backtrack(start + 1)` instead of `backtrack(i + 1)` in recursive call
Combinations / Subsets with Pruning
def subsets_with_dup(nums: list[int]) -> list[list[int]]:
nums.sort() # Sorting is mandatory to group duplicates for pruning
result = []
def backtrack(start: int, path: list[int]) -> None:
# Every node in the decision tree is a valid subset
result.append(list(path)) # Important: copy current path!
for i in range(start, len(nums)):
# Prune duplicate branches at the same tree level
if i > start and nums[i] == nums[i - 1]:
continue
path.append(nums[i]) # Make choice
backtrack(i + 1, path) # Explore choice (i + 1 prevents reuse)
path.pop() # Undo choice (backtrack)
backtrack(0, [])
return result- Cost
- O(2^n) subsets, O(n!) permutations · O(n) recursion call stack depth (Pruning invalid branches early is crucial for passing time limits.)
Canonical problems
#78 Subsets: Explore 2^n include/exclude decision tree
#46 Permutations: Explore all n! orderings using visited set
#39 Combination Sum: Allow reuse of same element with target reduction
#51 N-Queens: Prune attacks along cols, positive diagonals, negative diagonals
⌘K
Medium·43 companies·Max freq 100%·Acc 78.9%
ZenefitsTexas InstrumentsShift Technology+40
Medium·40 companies·Max freq 100%·Acc 66.4%
DropboxTrexquantEpic Systems+37
Medium·14 companies·Max freq 100%·Acc 0.7%
scalerNeetCode 150NeetCode 150+11
#113Path Sum II
Medium·10 companies·Max freq 63%·Acc 62.5%
Arista NetworksPalo Alto NetworksFlipkart+7
Medium·8 companies·Max freq 75%·Acc 38.8%
LinkedInZeta GlobalAmazon+5
Medium·7 companies·Max freq 100%·Acc 45.8%
GuidewireAmerican ExpressGeico+4
Medium·7 companies·Max freq 64%·Acc 89.5%
BNY MellonCitadelGoogle+4
Medium·6 companies·Max freq 100%·Acc 54.8%
PayPal HoneyGrowwPalo Alto Networks+3
Medium·5 companies·Max freq 90%·Acc 63.1%
SprinklrBloombergGoogle+2
Hard·5 companies·Max freq 88%·Acc 0.5%
AccentureGoogleMicrosoft+2
Medium·5 companies·Max freq 77%·Acc 59.3%
FlipkartTekionAmazon+2
Medium·5 companies·Max freq 63%·Acc 83.7%
BloombergNetflixAmazon+2
Medium·5 companies·Max freq 59%·Acc 0.9%
PaytmAmazonBloomberg+2
Hard·5 companies·Max freq 53%·Acc 46.0%
PinterestAmazonMicrosoft+2
Medium·5 companies·Max freq 38%·Acc 87.1%
MicrosoftBloombergGoogle+2
Medium·5 companies·Max freq 25%·Acc 72.6%
MetaGoogleAmazon+2
Medium·5 companies·Max freq 25%·Acc 68.7%
GoogleMetaAmazon+2
Medium·4 companies·Max freq 75%·Acc 50.9%
InfosysAmazonBloomberg+1
Medium·4 companies·Max freq 25%·Acc 81.7%
BloombergGoogleAmazon+1
Medium·3 companies·Max freq 100%·Acc 26.7%
Media.netMedia.netGoogle
Hard·3 companies·Max freq 100%·Acc 52.6%
TuSimpleOracleMicrosoft
Medium·3 companies·Max freq 44%·Acc 85.5%
Goldman SachsAmazonGoogle
Hard·3 companies·Max freq 25%·Acc 81.5%
AmazonBloombergGoogle
Hard·3 companies·Max freq 25%·Acc 55.1%
GoogleAmazonBloomberg
Medium·3 companies·Max freq 13%·Acc 58.9%
MetaAmazonGoogle
Hard·2 companies·Max freq 75%·Acc 49.1%
PayPalGoogle
Medium·2 companies·Max freq 63%·Acc 35.1%
SwiggyAmazon
Medium·1 companies·Max freq 88%·Acc 72.8%
Walmart Labs
# | Problem | Difficulty | Top Companies↓ | Frequency | Acceptance | |
|---|---|---|---|---|---|---|
| #22 | Generate Parentheses StringDynamic ProgrammingBacktrackingBracket Sequences | Medium | 100% | 78.9% | ||
| #17 | Letter Combinations of a Phone Number Hash TableStringBacktracking | Medium | 100% | 66.4% | ||
| #79 | Word Search ArrayStringBacktrackingDepth-First SearchMatrix | Medium | 100% | 47.7% | ||
| #39 | Combination Sum ArrayBacktracking | Medium | 100% | 76.8% | ||
| #46 | Permutations ArrayBacktracking | Medium | 81% | 82.1% | ||
| #212 | Word Search II ArrayStringBacktrackingTrieMatrix | Hard | 89% | 38.6% | ||
| #78 | Subsets ArrayBacktrackingBit Manipulation | Medium | 100% | 82.5% | ||
| #93 | Restore IP Addresses StringBacktracking | Medium | 97% | 56.4% | ||
| #140 | Word Break II ArrayHash TableStringDynamic ProgrammingBacktrackingTrieMemoization | Hard | 100% | 55.8% | ||
| #37 | Sudoku Solver ArrayHash TableBacktrackingMatrixAlgorithm XDancing Links | Hard | 100% | 65.6% | ||
| #40 | Combination Sum II ArrayBacktracking | Medium | 100% | 59.7% | ||
| #51 | N-Queens ArrayBacktrackingAlgorithm X | Hard | 94% | 76.0% | ||
| #126 | Word Ladder II Hash TableStringBacktrackingBreadth-First SearchBidirectional Search | Hard | 100% | 27.8% | ||
| #131 | Palindrome Partitioning StringDynamic ProgrammingBacktracking | Medium | 100% | 0.7% | ||
| #465 | Optimal Account Balancing ArrayDynamic ProgrammingBacktrackingBit ManipulationBitmask | Hard | 100% | 50.5% | ||
| #494 | Target Sum ArrayDynamic ProgrammingBacktrackingKnapsack Problem0-1 Knapsack | Medium | 75% | 52.5% | ||
| #90 | Medium | 79% | 61.6% | |||
| #132 | Palindrome Partitioning II StringDynamic Programming | Hard | 100% | 37.4% | ||
| #52 | N-Queens II BacktrackingAlgorithm X | Hard | 100% | 79.0% | ||
| #301 | Remove Invalid Parentheses StringBacktrackingBreadth-First Search | Hard | 76% | 50.0% | ||
| #113 | Path Sum II BacktrackingTreeDepth-First SearchBinary Tree | Medium | 63% | 62.5% | ||
| #473 | Matchsticks to Square ArrayDynamic ProgrammingBacktrackingBit ManipulationBitmask | Medium | 100% | 42.1% | ||
| #47 | Permutations II ArrayBacktrackingSorting | Medium | 50% | 63.7% | ||
| #257 | Binary Tree Paths StringBacktrackingTreeDepth-First SearchBinary Tree | Easy | 89% | 69.0% | ||
| #377 | Combination Sum IV ArrayDynamic Programming | Medium | 88% | 55.2% | ||
| #698 | Partition to K Equal Sum Subsets ArrayDynamic ProgrammingBacktrackingBit ManipulationMemoizationBitmask | Medium | 75% | 38.8% | ||
| #77 | Combinations Backtracking | Medium | 50% | 74.8% | ||
| #784 | Letter Case Permutation StringBacktrackingBit Manipulation | Medium | 100% | 75.9% | ||
| #2850 | Minimum Moves to Spread Stones Over Grid ArrayDynamic ProgrammingBacktrackingBit ManipulationMatrixBitmask | Medium | 100% | 45.8% | ||
| #282 | Expression Add Operators MathStringBacktracking | Hard | 90% | 43.4% | ||
| #679 | 24 Game ArrayMathBacktracking | Hard | 79% | 59.6% | ||
| #773 | Sliding Puzzle ArrayDynamic ProgrammingBacktrackingBreadth-First SearchMemoizationMatrixHeuristic SearchBidirectional SearchA* Search | Hard | 76% | 74.5% | ||
| #526 | Beautiful Arrangement ArrayDynamic ProgrammingBacktrackingBit ManipulationBitmask | Medium | 66% | 64.9% | ||
| #2044 | Count Number of Maximum Bitwise-OR Subsets ArrayBacktrackingBit ManipulationEnumeration | Medium | 64% | 89.5% | ||
| #489 | Robot Room Cleaner BacktrackingInteractive | Hard | 63% | 78.0% | ||
| #980 | Unique Paths III ArrayBacktrackingBit ManipulationMatrixHamiltonian Path | Hard | 52% | 82.9% | ||
| #1239 | Maximum Length of a Concatenated String with Unique Characters ArrayStringBacktrackingBit Manipulation | Medium | 100% | 54.8% | ||
| #638 | Shopping Offers ArrayDynamic ProgrammingBacktrackingBit ManipulationMemoizationBitmaskKnapsack ProblemComplete Knapsack | Medium | 94% | 52.6% | ||
| #1087 | Brace Expansion StringBacktrackingStackBreadth-First SearchSorting | Medium | 90% | 66.9% | ||
| #916 | Word Subsets ArrayHash TableString | Medium | 39% | 56.0% | ||
| #2065 | Maximum Path Quality of a Graph ArrayBacktrackingGraph Theory | Hard | 92% | 62.6% | ||
| #2048 | Next Greater Numerically Balanced Number Hash TableMathBacktrackingCountingEnumeration | Medium | 90% | 63.1% | ||
| #3348 | Smallest Divisible Digit Product II MathStringBacktrackingGreedyNumber Theory | Hard | 88% | 0.5% | ||
| #967 | Numbers With Same Consecutive Differences BacktrackingBreadth-First Search | Medium | 77% | 59.3% | ||
| #797 | All Paths From Source to Target BacktrackingDepth-First SearchBreadth-First SearchGraph TheoryDirected Acyclic Graph | Medium | 63% | 83.7% | ||
| #3211 | Generate Binary Strings Without Adjacent Zeros StringBacktrackingBit Manipulation | Medium | 59% | 0.9% | ||
| #1723 | Find Minimum Time to Finish All Jobs ArrayDynamic ProgrammingBacktrackingBit ManipulationBitmask | Hard | 53% | 46.0% | ||
| #1863 | Sum of All Subset XOR Totals ArrayMathBacktrackingBit ManipulationCombinatoricsEnumeration | Easy | 52% | 90.1% | ||
| #1219 | Path with Maximum Gold ArrayBacktrackingMatrix | Medium | 41% | 68.5% | ||
| #1079 | Letter Tile Possibilities Hash TableStringBacktrackingCounting | Medium | 38% | 83.5% | ||
| #1415 | The k-th Lexicographical String of All Happy Strings of Length n StringBacktracking | Medium | 38% | 87.1% | ||
| #89 | Gray Code MathBacktrackingBit Manipulation | Medium | 38% | 65.3% | ||
| #95 | Unique Binary Search Trees II Dynamic ProgrammingBacktrackingTreeBinary Search TreeBinary Tree | Medium | 28% | 62.8% | ||
| #357 | Count Numbers with Unique Digits MathDynamic ProgrammingBacktracking | Medium | 28% | 55.9% | ||
| #1718 | Construct the Lexicographically Largest Valid Sequence ArrayBacktracking | Medium | 25% | 72.6% | ||
| #401 | Binary Watch BacktrackingBit Manipulation | Easy | 25% | 65.8% | ||
| #1980 | Find Unique Binary String ArrayHash TableStringBacktracking | Medium | 25% | 81.2% | ||
| #1593 | Split a String Into the Max Number of Unique Substrings Hash TableStringBacktracking | Medium | 25% | 68.7% | ||
| #1994 | Hard | 100% | 37.6% | |||
| #1258 | Synonymous Sentences ArrayHash TableStringBacktrackingSortUnion-Find | Medium | 100% | 0.6% | ||
| #491 | Non-decreasing Subsequences ArrayHash TableBacktrackingBit Manipulation | Medium | 100% | 62.9% | ||
| #691 | Stickers to Spell Word ArrayHash TableStringDynamic ProgrammingBacktrackingBit ManipulationMemoizationBitmask | Hard | 89% | 51.0% | ||
| #2597 | The Number of Beautiful Subsets ArrayHash TableMathDynamic ProgrammingBacktrackingSortingCombinatorics | Medium | 75% | 50.9% | ||
| #216 | Combination Sum III ArrayBacktracking | Medium | 28% | 73.5% | ||
| #2698 | Find the Punishment Number of an Integer MathBacktracking | Medium | 25% | 81.7% | ||
| #2572 | Medium | 100% | 26.7% | |||
| #306 | Additive Number StringBacktracking | Medium | 100% | 34.1% | ||
| #2151 | Maximum Good People Based on Statements ArrayBacktrackingBit ManipulationEnumeration | Hard | 100% | 52.6% | ||
| #949 | Largest Time for Given Digits ArrayStringBacktrackingEnumeration | Medium | 100% | 36.0% | ||
| #1307 | Verbal Arithmetic Puzzle ArrayMathStringBacktracking | Hard | 88% | 33.4% | ||
| #756 | Pyramid Transition Matrix Hash TableStringBacktrackingBit Manipulation | Medium | 75% | 60.6% | ||
| #2375 | Construct Smallest Number From DI String StringBacktrackingStackGreedy | Medium | 44% | 85.5% | ||
| #1255 | Maximum Score Words Formed by Letters ArrayHash TableStringDynamic ProgrammingBacktrackingBit ManipulationCountingBitmask | Hard | 25% | 81.5% | ||
| #2014 | Longest Subsequence Repeated k Times Hash TableTwo PointersStringBacktrackingCountingEnumeration | Hard | 25% | 71.1% | ||
| #1240 | Tiling a Rectangle with the Fewest Squares Backtracking | Hard | 25% | 55.1% | ||
| #3577 | Count the Number of Computer Unlocking Permutations ArrayMathBrainteaserCombinatorics | Medium | 13% | 58.9% | ||
| #1799 | Maximize Score After N Operations ArrayMathDynamic ProgrammingBacktrackingBit ManipulationNumber TheoryBitmask | Hard | 97% | 57.9% | ||
| #2056 | Number of Valid Move Combinations On Chessboard ArrayStringBacktrackingSimulation | Hard | 75% | 49.1% | ||
| #254 | Factor Combinations BacktrackingPrime Factorization | Medium | 63% | 50.6% | ||
| #1986 | Minimum Number of Work Sessions to Finish the Tasks ArrayDynamic ProgrammingBacktrackingBit ManipulationBitmask | Medium | 63% | 35.1% | ||
| #996 | Number of Squareful Arrays ArrayHash TableMathDynamic ProgrammingBacktrackingBit ManipulationBitmask | Hard | 51% | 51.6% | ||
| #2305 | Fair Distribution of Cookies ArrayDynamic ProgrammingBacktrackingBit ManipulationBitmask | Medium | 39% | 70.0% | ||
| #1947 | Maximum Compatibility Score Sum ArrayDynamic ProgrammingBacktrackingBit ManipulationBitmaskHungarian AlgorithmBipartite GraphSuccessive Shortest Path AlgorithmMatching (Graph)Perfect MatchingMinimum-Cost FlowFlow Network | Medium | 25% | 64.7% | ||
| #294 | Flip Game II MathDynamic ProgrammingBacktrackingMemoizationMinimaxGame TheorySprague–Grundy TheoremImpartial Game | Medium | 25% | 52.4% | ||
| #842 | Split Array into Fibonacci Sequence StringBacktracking | Medium | 25% | 40.5% | ||
| #988 | Smallest String Starting From Leaf StringBacktrackingTreeDepth-First SearchBinary Tree | Medium | 25% | 61.3% | ||
| #411 | Minimum Unique Word Abbreviation ArrayStringBacktrackingBit Manipulation | Hard | 25% | 40.5% | ||
| #3343 | Count Number of Balanced Permutations MathStringDynamic ProgrammingCombinatorics | Hard | 15% | 49.0% | ||
| #3669 | Balanced K-Factor Decomposition MathBacktrackingNumber Theory | Medium | 13% | 40.4% | ||
| #2212 | Maximum Points in an Archery Competition ArrayBacktrackingBit ManipulationEnumeration | Medium | 100% | 52.3% | ||
| #3376 | Minimum Time to Break Locks I ArrayDynamic ProgrammingBacktrackingBit ManipulationBreadth-First SearchBitmask | Medium | 100% | 32.8% | ||
| #2152 | Minimum Number of Lines to Cover Points ArrayHash TableMathDynamic ProgrammingBacktrackingBit ManipulationGeometryBitmask | Medium | 88% | 44.1% | ||
| #1215 | Stepping Numbers MathBacktrackingBreadth-First Search | Medium | 88% | 48.6% | ||
| #1238 | Circular Permutation in Binary Representation MathBacktrackingBit Manipulation | Medium | 88% | 72.8% | ||
| #2992 | Number of Self-Divisible Permutations ArrayMathDynamic ProgrammingBacktrackingBit ManipulationNumber TheoryBitmask | Medium | 63% | 72.1% | ||
| #3939 | Count Non Adjacent Subsets in a Rooted Tree ArrayDynamic ProgrammingTreeDepth-First Search | Hard | 63% | 56.1% | ||
| #3799 | Word Squares II ArrayStringBacktrackingSortingEnumeration | Medium | 56% | 55.2% | ||
| #1745 | Palindrome Partitioning IV StringDynamic Programming | Hard | 51% | 45.5% | ||
| #2397 | Maximum Rows Covered by Columns ArrayBacktrackingBit ManipulationMatrixEnumeration | Medium | 50% | 58.2% | ||
| #3437 | Permutations III ArrayBacktracking | Medium | 50% | 85.9% | ||
| #2664 | The Knight’s Tour ArrayBacktrackingMatrix | Medium | 38% | 72.7% | ||
| #3646 | Next Special Palindrome Number BacktrackingBit Manipulation | Hard | 38% | 28.3% | ||
| #351 | Android Unlock Patterns Dynamic ProgrammingBacktrackingBit ManipulationBitmask | Medium | 38% | 53.9% | ||
| #1601 | Maximum Number of Achievable Transfer Requests ArrayBacktrackingBit ManipulationEnumeration | Hard | 25% | 64.8% | ||
| #2638 | Count the Number of K-Free Subsets ArrayMathDynamic ProgrammingSortingCombinatorics | Medium | 25% | 47.3% | ||
| #681 | Next Closest Time Hash TableStringBacktrackingEnumeration | Medium | 25% | 47.0% | ||
| #2178 | Maximum Split of Positive Even Integers MathBacktrackingGreedy | Medium | 25% | 59.8% | ||
| #1096 | Brace Expansion II Hash TableStringBacktrackingStackBreadth-First SearchSorting | Hard | 25% | 63.9% | ||
| #1655 | Distribute Repeating Integers ArrayHash TableDynamic ProgrammingBacktrackingBit ManipulationCountingBitmask | Hard | 25% | 41.0% | ||
| #320 | Generalized Abbreviation StringBacktrackingBit Manipulation | Medium | 25% | 60.5% | ||
| #425 | Word Squares ArrayStringBacktrackingTrie | Hard | 25% | 54.7% | ||
| #816 | Ambiguous Coordinates StringBacktrackingEnumeration | Medium | 25% | 56.6% | ||
| #1066 | Campus Bikes II ArrayDynamic ProgrammingBacktrackingBit ManipulationBitmaskHungarian AlgorithmBipartite GraphSuccessive Shortest Path AlgorithmMatching (Graph)Minimum-Cost FlowFlow Network | Medium | 25% | 55.9% | ||
| #1088 | Confusing Number II MathBacktracking | Hard | 25% | 47.2% | ||
| #1286 | Iterator for Combination StringBacktrackingDesignIterator | Medium | 25% | 72.7% | ||
| #1774 | Closest Dessert Cost ArrayDynamic ProgrammingBacktrackingKnapsack ProblemMixed Knapsack | Medium | 25% | 48.9% | ||
| #3566 | Partition Array into Two Equal Product Subsets ArrayBit ManipulationRecursionEnumeration | Medium | 13% | 35.3% |
Showing 117 of 117 problems in Backtracking & Exhaustive SearchFiltered: All Companies