LeetCode ----22.括号生成 (字符串+回溯)

题目

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例:
输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

思路:这是一道经典的深度搜索的题目,我们可以使用暴力搜索+剪枝进行解决。这里我们可以把它看成一颗以左括号为根结点的树,它有两种扩展节点方法,要么是增加左括号,要么是增加右括号。两种情况分别为dfs(left - 1, right, curStr + “(”); dfs(left, right - 1, curStr + “)”);直到扩展到最后一个叶子节点,这样就得到一种结果。然后我们再进行回溯处理,遍历出所有的结果集(这里可以采用判断把不合理的情况进行剪枝处理)

相关图解:(这里的剪枝可结合代码进行理解)
LeetCode ----22.括号生成 (字符串+回溯)_第1张图片
代码:

class Solution {
     //存放结果集
     public List<String> result = new ArrayList<String>();
	 public List<String> generateParenthesis(int n) {
		 dfs(n,n,"");
		 return result;
	 }
	 public  void dfs(int left,int right,String str) {
	     //如果左右括号都为0表示该结果已扩展完成
		 if(left == 0 && right == 0) {
			 result.add(str);
			 return;
		 }
		 //若还存在左括号
		 if(left > 0) {
			 dfs(left-1,right,str+"(");
		 }
		 //若右括号的个数大于左括号的个数
		 if(right>left) {
			 dfs(left,right-1,str+")");
		 }
	 }

}

你可能感兴趣的:(算法)