題目鏈接: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);
}
}
}