解题思路:
1 最朴素的想法是:对每种可能出现的序列情况排列组合,将最后不符合条件的情况剔除。
2 回溯法:和上方的思路差不多,但是只要在组建字符串的过程中,出现了不符合要求的情况,直接将其丢弃。
3 所有序列可以被看成是一个二叉树,根节点是空字符串,左孩子加左括号,右孩子加右括号。每个结果都对应了树里的一个从根到节点的序列。对每个节点进行丢弃分析,需要我们把字符串形成过程中每加一个左/右括号的情况都拿出来分析。综上所述,递归比较符合我们的需求。
代码:
class Solution {
public List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<>();
getParentheses(result,n,"",0,0);
return result;
}
void getParentheses(List<String> result, int max, String nowStr, int haveLeft, int haveRight){
if (haveLeft + haveRight == max*2){
result.add(nowStr);
return;
}
if (haveLeft < max){
getParentheses(result, max, nowStr+"(", haveLeft+1, haveRight);
}
if (haveRight < haveLeft){
getParentheses(result, max, nowStr+")", haveLeft, haveRight+1);
}
}
}