재귀적으로 호출하여서 괄호를 만들었다. 중복으로 괄호가 추가되는 것을 방지하기 위해서 set으로 체크를 하였다.
class Solution {
public Map<Integer, List<String>> dp = new HashMap<>();
public List<String> generateParenthesis(int n) {
if (dp.get(n) != null) {
return dp.get(n);
}
if (n == 1) {
List<String> list = new ArrayList<>();
list.add("()");
dp.put(1, list);
return list;
}
List<String> answer = new ArrayList<>();
List<String> smallerOne = generateParenthesis(n - 1);
Set<String> checked = new HashSet<>();
for (int i = 0; i < smallerOne.size(); i++) {
answer.add("(" + smallerOne.get(i) + ")");
}
for (int i = 1; i < n; i++) {
List<String> left = generateParenthesis(i);
List<String> right = generateParenthesis(n - i);
for (int x = 0; x < left.size(); x++) {
for (int y = 0; y < right.size(); y++) {
String newStr = left.get(x) + right.get(y);
if (!checked.contains(newStr)) {
checked.add(newStr);
answer.add(newStr);
}
}
}
}
dp.put(n, answer);
return answer;
}
}
반응형
'Algorithm > LeetCode' 카테고리의 다른 글
[Java] LeetCode 25번 Reverse Nodes in k-Group (0) | 2021.09.30 |
---|---|
[Java] LeetCode 23번 Merge k Sorted Lists (0) | 2021.09.29 |
[Java] LeetCode 21번 Merge Two Sorted Lists (0) | 2021.09.28 |
[Java] LeetCode 20번 Valid Parentheses (0) | 2021.09.27 |
[Java] LeetCode 19번 Remove Nth Node From End of List (0) | 2021.09.26 |