您的位置:首页 > 其它

LeetCode 22 :Generate Parentheses

2016-12-07 21:27 218 查看


作为经典的回溯问题,这道题对于理解回溯的基本框架帮助还是挺大的。

所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集

所以在思考问题的时候,首先需要考虑:

1. 边界条件(任何算法都需要考虑这个,往往输入并不如你所想那么理想)

2. 满足解的条件(当满足解,则添加进解集,这有点像并查集,当然有的只需要返回一个解即可)

3. 否则继续寻找

对于这道题,在任何时刻,你都有两种选择:左括号或者有括号,同时也有边界条件

当左括号的数量大于右括号的数量时,则返回,即不可能存在解。

同时,当满足左右两边括号用完之后,即满足条件的解,此时加入到解集当中,否则继续寻找

public class Solution {
public List<String> ans = new ArrayList<>();
public void robot(int left , int right,String str ){
//不可能存在合理的解 返回 不继续搜索
if(left>right) return;
//满足条件的解
if(left==0 && right==0){
ans.add(str);
return;
}else{
//枚举不同的可能性
if(left>0){
robot(left-1,right,str+"(");
}
if(right>0){
robot(left,right-1,str+")");
}
}
}
public List<String> generateParenthesis(int n) {
robot(n,n,"");
return ans;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 回溯 DFS