问题描述
问题分析
分析题目,括号生成的过程可以视为对一个空字符串不断添加“(“或”)”的过程。最直观的解法是使用暴力法:生成所有可能的括号组合,然后依次进行判断括号是否合法有效。我们可以尝试对暴力法进行优化:只有在合法有效的情况下才添加正反括号,而非暴力法的强行盲目的添加括号。基于以上考虑,我们采用回溯法的思路:**能进则进,进不了就换,换不了就退。**使用回溯法的关键是找到递归出口
- 若当前字符串长度等于n*2,则表示找到一个解,为递归出口;
- 若当前字符串中“(“的个数小于n,那么表示还需要添加“(“。则给当前字符串添加“(”,并且open计数+1,继续递归;
- 若当前字符串中”)”的个数小于“(“的个数,那么表示还需要添加“)“。则给当前字符串添加“)”,并且close计数+1,继续递归;
解法:回溯法
Java代码
class Solution {
public List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<String>();
getResult(result, "", 0, 0, n);
return result;
}
private static void getResult(List<String> result, String cur, int open, int close, int max) {
//递归结束条件
if (cur.length() == max*2){
result.add(cur);
return;
}
//递归
if (open < max){
getResult(result, cur + "(", open+1, close, max);
}
if (close < open){
getResult(result, cur + ")", open, close+1, max);
}
}
}
结果分析
以上代码的执行结果:
执行时间 | 内存消耗 |
---|---|
4 ms | 38.2 MB |