Backtracking Subset¶
Table of Contents¶
- 78. Subsets (Medium)
- 784. Letter Case Permutation (Medium)
- 1286. Iterator for Combination (Medium)
- 494. Target Sum (Medium)
- 2397. Maximum Rows Covered by Columns (Medium)
- 1239. Maximum Length of a Concatenated String with Unique Characters (Medium)
- 2212. Maximum Points in an Archery Competition (Medium)
- 1255. Maximum Score Words Formed by Letters (Hard)
- 2151. Maximum Good People Based on Statements (Hard)
- 2597. The Number of Beautiful Subsets (Medium)
- 2959. Number of Possible Sets of Closing Branches (Hard)
- 1601. Maximum Number of Achievable Transfer Requests (Hard)
- 1617. Count Subtrees With Max Distance Between Cities (Hard)
- 320. Generalized Abbreviation (Medium) 👑
- 254. Factor Combinations (Medium) 👑
- 39. Combination Sum (Medium)
78. Subsets¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, backtracking, bit manipulation
from typing import List
# Iterative Inclusion Backtracking
def subsets_iterative_inclusion(nums: List[int]) -> List[List[int]]:
n = len(nums)
res, path = [], []
def dfs(i):
res.append(path.copy())
for j in range(i, n):
path.append(nums[j])
dfs(j + 1)
path.pop()
dfs(0)
return res
# Binary Decision Backtracking
def subsets_binary_decision(nums: List[int]) -> List[List[int]]:
n = len(nums)
res, path = [], []
def dfs(i):
if i == n:
res.append(path.copy())
return
# Exclude
dfs(i + 1)
# Include
path.append(nums[i])
dfs(i + 1)
path.pop()
dfs(0)
return res
print(subsets_iterative_inclusion([1, 2, 3]))
# [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]
print(subsets_binary_decision([1, 2, 3]))
# [[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]
784. Letter Case Permutation¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: string, backtracking, bit manipulation
1286. Iterator for Combination¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: string, backtracking, design, iterator
494. Target Sum¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, dynamic programming, backtracking
from typing import List
def findTargetSumWays(nums: List[int], target: int) -> int:
totalSum = sum(nums)
if abs(target) > totalSum:
return 0
if (target + totalSum) % 2 == 1:
return 0
targetSum = (target + totalSum) // 2
dp = [0] * (targetSum + 1)
dp[0] = 1
for i in range(len(nums)):
for j in range(targetSum, nums[i] - 1, -1):
dp[j] += dp[j - nums[i]]
return dp[targetSum]
nums = [1, 1, 1, 1, 1]
target = 3
print(findTargetSumWays(nums, target)) # 5
2397. Maximum Rows Covered by Columns¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, backtracking, bit manipulation, matrix, enumeration
1239. Maximum Length of a Concatenated String with Unique Characters¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, string, backtracking, bit manipulation
2212. Maximum Points in an Archery Competition¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, backtracking, bit manipulation, enumeration
1255. Maximum Score Words Formed by Letters¶
-
LeetCode | LeetCode CH (Hard)
-
Tags: array, string, dynamic programming, backtracking, bit manipulation, bitmask
2151. Maximum Good People Based on Statements¶
-
LeetCode | LeetCode CH (Hard)
-
Tags: array, backtracking, bit manipulation, enumeration
2597. The Number of Beautiful Subsets¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, hash table, math, dynamic programming, backtracking, sorting, combinatorics
2597. The Number of Beautiful Subsets - C++ Solution#include <functional> #include <iostream> #include <unordered_map> #include <vector> using namespace std; class Solution { public: int beautifulSubsets(vector<int>& nums, int k) { int res = 0; unordered_map<int, int> cnt; auto dfs = [&](auto&& self, int i) -> void { if (i == (int)nums.size()) { res++; return; } self(self, i + 1); // Skip nums[i] int x = nums[i]; if (cnt[x - k] == 0 && cnt[x + k] == 0) { cnt[x]++; self(self, i + 1); // Include nums[i] cnt[x]--; // Backtrack } }; dfs(dfs, 0); return res - 1; } }; int main() { Solution sol; vector<int> nums = {1, 2, 3, 4}; int k = 1; cout << sol.beautifulSubsets(nums, k) << endl; return 0; }
2959. Number of Possible Sets of Closing Branches¶
-
LeetCode | LeetCode CH (Hard)
-
Tags: bit manipulation, graph, heap priority queue, enumeration, shortest path
1601. Maximum Number of Achievable Transfer Requests¶
-
LeetCode | LeetCode CH (Hard)
-
Tags: array, backtracking, bit manipulation, enumeration
1617. Count Subtrees With Max Distance Between Cities¶
-
LeetCode | LeetCode CH (Hard)
-
Tags: dynamic programming, bit manipulation, tree, enumeration, bitmask
320. Generalized Abbreviation¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: string, backtracking, bit manipulation
254. Factor Combinations¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: backtracking
39. Combination Sum¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, backtracking
from typing import List
def combinationSum(candidates: List[int], target: int) -> List[List[int]]:
n = len(candidates)
res, path = [], []
def dfs(total, start):
if total > target:
return
if total == target:
res.append(path.copy())
return
for i in range(start, n):
total += candidates[i]
path.append(candidates[i])
dfs(total, i)
total -= candidates[i]
path.pop()
dfs(0, 0)
return res
if __name__ == "__main__":
print(combinationSum([2, 3, 5], 8))
# [[2, 2, 2, 2], [2, 3, 3], [3, 5]]
print(combinationSum([2, 3, 6, 7], 7))
# [[2, 2, 3], [7]]