Leetcode---括号生成--回溯

括号生成

题目链接:括号生成

思路:
  • 回溯法的结果集一般是搜索过程中动态生成的
  • 利用条件限制不合法的子集生成,避免庞大的无效递归
  • 当结果不满足条件时返回到上一层,应当恢复为之前的状态
  • 这里两个存储空间,所以互不影响
public List<String> generateParenthesis(int n) {
		//构造一个结果集
		List<String> list = new ArrayList<String>();
		if(n==0) {
			return list;
		}
		//调用回溯
		traceback(list,"",0,0,n);
		return list;
    }
	
	public void traceback(List<String> list,String temp,int left,int right,int n) {
		//如果左括号越界,或者右括号越界,或者右括号比左括号多,都直接return,不满足正常括号的要求
		//也可视为剪枝,不满足要求的不再深入递归
		if(left>n||right>left||right>n) {
			return ;
		}
		//达到递归深度了,并且满足要求的括号添加至结果集
		if(left==n&&right==n) {
			list.add(temp);
			return ;
		}
		//注意此时temp+'('已经相当于重新申请了一块内存,而不是和temp占用同一块,即temp内存中的值没有变化
		//下一层添加'('或者')'均可,所以有两种递归
		traceback(list,temp+'(',left+1,right,n);
		//回溯需要返回上一层,所以要保存之前的值不能被破坏,这里由于是两块内存,所以并没有影响
		traceback(list,temp+')',left,right+1,n);
	}

猜你喜欢

转载自blog.csdn.net/tiaochewang219/article/details/84779458
今日推荐