[LeetCode]Generate Parentheses
原创
©著作权归作者所有:来自51CTO博客作者byamao1的原创作品,请联系作者获取转载授权,否则将追究法律责任
Question:
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.For example, given n = 3, a solution set is:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
本题难度medium。我采用的是树的方法(与Letter Combinations of a Phone Number 差不多的思路 ),采用递归进行先序遍历。注意的是需要进行“剪枝”:
设ln代表左括号的个数,rn代表右括号的个数。
当 ln>n||rn>n-1||ln<rn 时,都需要剪枝。
之所以是rn>n-1而不是n,是因为最后的一定是右括号。
剪枝不仅仅是提高了运行效率,同时也是在递归中必须要时刻进行检查看是否违反规则。代码如下:
public class Solution {
public List<String> generateParenthesis(int n) {
//require
List<String> ans=new ArrayList<String>();
if(n<1)
return ans;
int ln=1,rn=0;
//invariant
fun(ln,rn,n,"(",ans);
//ensure
return ans;
}
public void fun(int ln,int rn,int n,String father,List<String> ans){
//bound
if(ln>n||rn>n-1||ln<rn)return;
if(ln+rn==2*n-1){
ans.add(father+")");
return;
}
String son=father+"(";
fun(ln+1,rn,n,son,ans);
son=father+")";
fun(ln,rn+1,n,son,ans);
}
}
discuss中有一个解法,与这个类似,写法更加简洁。
Easy java solution
public class Solution {
private void helper(List<String> res, String present, int left, int right) {
if (right == 0) {
res.add(present);
}
if (left > 0) {
helper(res, present + "(", left - 1, right);
}
if (right > left) {
helper(res, present + ")", left, right - 1);
}
}
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<String>();
if (n == 0) {
return res;
}
helper(res, "", n, n);
return res;
}
}
【后记】
我本打算写个循环版本来提高效率,不过还是放弃了。问题在于对于每一次循环,都需要从前一次循环的结果集中提取字符串及其相应的左右括号个数,如果每次都进行现场计算效率太差,如果结果集使用map又浪费空间。