Topic
- String
- Backtracking
Description
https://leetcode.com/problems/generate-parentheses/
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
Example 1:
Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]
Example 2:
Input: n = 1
Output: ["()"]
Constraints:
- 1 <= n <= 8
Analysis
方法一:暴力算法,生成可能结果,然后验证排除结果,时杂O(2²ⁿ),效率不高。
方法二:回溯算法。根据代码理解下面n=3例子树图:
(
/ \
/ \
/ \
(( ()
/ \ \
((( (() ()(
/ / \ / \
((() (()( (()) ()(( ()()
/ | | | |
((()) (()() (())( ()(() ()()(
| | | | |
((())) (()()) (())() ()(()) ()()()
Submission
import java.util.ArrayList;
import java.util.List;
public class GenerateParentheses {
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
backtracking(list, new StringBuilder(), 0, 0, n);
return list;
}
private void backtracking(List<String> list, StringBuilder sb, int open, int close, int max) {
if (open == max && close == max) {
list.add(sb.toString());
return;
}
if (open < max) {
backtracking(list, sb.append('('), open + 1, close, max);
sb.setLength(sb.length() - 1);
}
if (close < open) {
backtracking(list, sb.append(')'), open, close + 1, max);
sb.setLength(sb.length() - 1);
}
}
}
Test
import static org.junit.Assert.*;
import org.hamcrest.collection.IsIterableContainingInAnyOrder;
import org.hamcrest.core.IsCollectionContaining;
import org.junit.Test;
public class GenerateParenthesesTest {
@Test
public void test() {
GenerateParentheses obj = new GenerateParentheses();
assertThat(obj.generateParenthesis(3), //
IsIterableContainingInAnyOrder.containsInAnyOrder("((()))", "(()())", "(())()", "()(())", "()()()"));
assertThat(obj.generateParenthesis(1), IsCollectionContaining.hasItem("()"));
}
}