其实回溯,我本来就不熟悉,只知道和栈相关,这道题被困住了,我就看了一遍,回溯算法的介绍,理解了其中关键和空间结构的选择有关,最常见的就是树结构。树的深度遍历,是有层次的(level),是可以倒退的(level--),哈哈,同时这道题有个局限就是,left(左括号)一定要大于等于right(右括号)。
题目要求:
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:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
解题方法:
package test;
import java.util.ArrayList;
import java.util.List;
public class LC22Try3
{
public List<String> generateParenthesis(int n)
{
List<String> ret = new ArrayList<String>();
if(n==0){
return ret;
}
String s="(";
dpTree(n,1,0,s,ret);
return ret;
}
public void dpTree(int level,int left,int right,String s,List<String> ret){
if(left>=level){
if(right<left){
for(int j=right+1;j<=left;j++){
s+=")";
}
}
ret.add(s);
return;
}
dpTree(level,left+1,right,s+'(',ret);
if(right<left){
dpTree(level,left,right+1,s+')',ret);
}
}
public static void main(String[] args)
{
LC22Try3 t = new LC22Try3();
List<String> ret= t.generateParenthesis(3);
for(int i=0;i<ret.size();i++){
System.out.println(ret.get(i));
}
}
}
思路上,有点儿,慢了,希望进步,加油
哈哈