您的位置:首页 > 其它

LeetCode 22 Generate Parentheses(找到所有匹配的括号组合)

2017-03-08 13:11 656 查看
题目链接 : https://leetcode.com/problems/generate-parentheses/?tab=Description

给一个整数n,找到所有合法的 () pairs

For example, given n = 3, a solution set is:

[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]



递归程序:首先合法的pairs一定是左括号个数等于右括号个数。因此对于n对pairs,左括号个数为n个。
递归程序,按照括号个数进行判断。当左括号个数小于n时,str+”(“,当右括号个数小于左括号个数时,str+”)”

分析递归程序需要传递的参数:
首先要将保存结果的List<String> list传递进去,然后是每次修改之后的str,之后需要知道左括号个数 open ,还有右括号个数 close , 最后是最大括号个数为 max

private void backtrack(List<String> list,String str, int open, int close, int max)

当str长度等于2*max时,说明结束,此时需要执行 list.add(str)

当open < max 时 添加一个( 执行 backtrack ( list, str + ”(“, open+1, close, max);

当close < open 时 添加一个 ) 执行 backtrack ( list, str+ “)”, open, close +1 ,max);

因此执行顺序为: 先得到右括号个数连续个数为max时(从下标为0开始)的情况,在得到右括号连续个数为max-1 时的情况 (此时会进行执行添加右括号的命令)

参考代码:

package leetcode_50;

import java.util.ArrayList;
import java.util.List;

/***
*
* @author pengfei_zheng
* n对合理括号结果求解问题
*/
public class Solution22 {
public static List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
backtrack(list,"",0,0,n);

return list;
}
private static void backtrack(List<String> list,String str, int open, int close, int max) {
if(str.length()==2*max){
list.add(str);
return;
}
if(open<max)
backtrack(list,str+"(",open+1,close,max);
if(close<open)
backtrack(list,str+")",open,close+1,max);
}
public static void main(String[]args){
List<String> list = generateParenthesis(3);
System.out.println(list);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: