Matchsticks to Square

Can the matchsticks be partitioned into 4 equal-sum groups? Backtrack with sort-descending pruning.

Medium
Time O(4^n) Space O(n)
LeetCode
5 min read
backtracking

Problem#

Use every matchstick exactly once to form a square. Return true iff possible.

Examples#

  • [1,1,2,2,2]true
  • [3,3,3,3,4]false

Constraints#

  • 1 <= n <= 15.

Approach#

If total % 4 != 0, false. Sort descending — placing large sticks first prunes early. DFS assigning each stick to one of four sides; prune if any side exceeds total/4.

Solution#

Matchsticks to Square
class Solution {
public:
bool makesquare(vector<int>& matchsticks) {
int total = accumulate(matchsticks.begin(), matchsticks.end(), 0);
if (total % 4 != 0) return false;
int side = total / 4;
sort(matchsticks.rbegin(), matchsticks.rend());
if (matchsticks[0] > side) return false;
vector<int> sides(4, 0);
function<bool(int)> dfs = [&](int i) {
if (i == (int)matchsticks.size()) return sides[0] == sides[1] && sides[1] == sides[2] && sides[2] == sides[3];
for (int k = 0; k < 4; ++k) {
if (sides[k] + matchsticks[i] > side) continue;
// Skip identical-side states.
if (k > 0 && sides[k] == sides[k - 1]) continue;
sides[k] += matchsticks[i];
if (dfs(i + 1)) return true;
sides[k] -= matchsticks[i];
}
return false;
};
return dfs(0);
}
};

Editorial#

Two pruning rules cut the search dramatically: (a) descending sort places large sticks first, so over-side conditions trigger early; (b) the “skip identical-side state” check avoids placing the same stick on equivalent sides (sides[k] == sides[k-1]).

Complexity#

  • Time: O(4^n) worst-case, very practical due to pruning.
  • Space: O(n).

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.