[LeetCode] 22. Generate Parentheses Java

题目:

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:

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

题意及分析:这道题是给出一个括号对的数目,求可能的合法的括号顺序。这道题可以应用回溯(这也是我做的第一道回溯题->->,也不知道怎么讲。。),对题目进行观察可知边界条件为 在任一个合法字符串的子字符串中:左括号数目大于等于右括号数目、左括号数<=n,所以我们可以得出回溯点。下面的代码我是用递归求解的,也可以用非递归求。首先用一个char类型的数组保存当前得到的值,然后每次对char[]进行判断,符合条件就进行下一个位置的求解,直到最后一个位置(i=2*n-1).

代码:

public class Solution {
    public List<String> generateParenthesis(int n) {
        
        List<String> resList = new ArrayList<>();
        char[] possible=new char[2*n];
        traceBack(resList,possible,0, 2*n);
		return resList;
    }
	
	public void traceBack(List<String> resList,char[] possible,int t,int m){	//这里的m=2*n
		char[] x={'(',')'};
		if(t>=m){		//有解,输出结果
			String string=String.valueOf(possible);
			resList.add(string);
		}else{
			for(int i=0;i<=1;i++){
				int left=0,right=0;
				possible[t]= x[i];
				for(int j=0;j<=t;j++){
					if(possible[j]==')'){
						right++;
					}else
						left++;
				}
				//边界条件为(的数目大于等于)数,且left<=n
				if(left>=right&&left<=m/2){	//继续下一维度的计算
					traceBack(resList,possible,t+1, m);
				}
			}
		}
		return;	
	}
}

  

原文地址:https://www.cnblogs.com/271934Liao/p/6939834.html