---
# System prepended metadata

title: 473. Matchsticks to Square
tags: [leetcode]

---

# 473. Matchsticks to Square
#### Difficulty: Medium
link: https://leetcode.com/problems/matchsticks-to-square/

### 1. DFS w/ Optimization  
#### $O(4^N)$ runtime, $O(N)$ space

我覺得應該是hard等級的題目，很難想QQ

將火柴棍分為四群，令每一群長度總和相同。

第一種優化，只考慮火柴棍還放得下的群。
第二種優化，從長火柴棍開始做dfs會快很多，
第三種優化，用到DP的概念，如果當前group=[5,2,3,5]，已知將第i個火柴棍放第一群的結果是False，那麼放第四群的結果將和第一群的結果相同，因此不用重複檢查。

##### python
```python=
class Solution:
    def makesquare(self, matchsticks: List[int]) -> bool:
        target, rem = divmod(sum(matchsticks), 4)
        if rem != 0:
            return False
        
        # 2nd optimization
        matchsticks.sort(reverse=True)
        if (matchsticks[0] > target): 
            return False
        
        group = [target] * 4
        def dfs(i):
            if i == len(matchsticks):
                return True
            m = matchsticks[i]
            for j in range(4):
                # 1st and 3rd optimzation
                if m <= group[j] and group[j] not in group[:j]:
                    group[j] -= m
                    if dfs(i + 1): return True
                    group[j] += m
            return False
        
        return dfs(0)
```
<font color="#00AB5F ">Accepted</font>  
Runtime: **60 ms**, faster than **88.92%** of Python3 online submissions for Matchsticks to Square.
Memory Usage: **14.3 MB**, less than **51.80%** of Python3 online submissions for Matchsticks to Square.

###### tags: `leetcode`