题目链接:https://leetcode.com/problems/generate-parentheses/#/description
题目要求:给定正整数n,求n对括号所有正确配对的组合。
思路:采用分支限界和回溯算法,考虑一颗二叉树,根节点为(,向左走只添加左括号,向右走只添加有括号。在遍历该二叉树的时候,采用分支限界和回溯方法,只获得满足条件的括号对。
Java代码如下:
public class Solution {
private List<String> result;
Solution() {
result = new LinkedList<String>();
}
public List<String> generateParenthesis(int n) {
String s = "";
if (n > 0) {
generateParenthsisHelper(s, n, 0, 0);
}
return result;
}
/**
* 生成括号对的方法
* @param s 一个括号对序列
* @param n 括号的对数
* @param left 左括号的个数
* @param right 右括号的个数
*/
public void generateParenthsisHelper(String s, int n, int left, int right) {
// 如果总的节点个数达到了上限,表示一个括号对已经生成完毕
if ((left + right) == 2 * n) {
result.add(s);
return;
}
// 如果左括号数量还不够n,则添加一个左括号
// 这个条件有点像剪枝条件,当左括号树超过n之后,它之下的分支都不符合条件,因此可以剪去该枝
if (left < n) {
s += "(";
// 然后递归的构造括号对
generateParenthsisHelper(s, n, left + 1, right);
// 回溯 举例来说,当(((的情况处理完之后,回溯处理((的情况,当((的情况处理完之后,回溯处理(的情况
s = s.substring(0, s.length() - 1);
}
if (right < left) {
s += ")";
generateParenthsisHelper(s, n, left, right + 1);
s = s.substring(0, s.length() - 1);
}
}
}