题目
- 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
代码
class Solution {
static List<String> list;
public static List<String> generateParenthesis(int n) {
//使用递归的思想进行暴力生成
//先初始化一个字符数组,用来保存每次生成的串
list=new LinkedList<>();
char[] cH=new char[2*n];
//
create(cH,0,n);
return list;
}
private static void create(char[] cH, int pos, int n) {
//
if(pos==2*n) {//终止条件,判断产生的串是否符合左右括号相等的要求
if(valid(cH,pos))
list.add(new String(cH));
}
else {
cH[pos]='(';
create(cH,pos+1,n);
cH[pos]=')';
create(cH,pos+1,n);
}
}
private static boolean valid(char[] cH, int pos) {
int s=0;
for(int i=0;i<pos;i++) {
char c=cH[i];
if(c=='(')
s++;
else
s--;
if(s<0)
return false;
}
if(s==0)
return true;
return false;
}
}
//大佬的1ms代码
class Solution {
/*
* DFS算法
* 时间复杂度:O(n),空间复杂度:O(1)
*/
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<String>();
if (n < 0) return list;
dfs(0, n, n, new char[n << 1], list);
return list;
}
private void dfs(int idx, int leftRemain, int rightRemain, char[] string, List<String> list) {
if (idx == string.length) {
list.add(new String(string));
return;
}
// 枚举这一层所有可能的选择
// 选择一种可能之后,进入下一层搜索
// 什么情况可以选择左括号?左括号的数量 > 0
// 选择左括号,然后进入下一层搜索
if (leftRemain > 0) {
string[idx] = '(';
dfs(idx+1, leftRemain-1, rightRemain, string, list);
}
// 当左括号、右括号的数量一样时,只能选择左括号
// 什么情况可以选择右括号?(右括号的数量 > 0) && (右括号的数量 != 左括号的数量)
// 选择右括号,然后进入下一层搜索
if (rightRemain > 0 && leftRemain != rightRemain) {
string[idx] = ')';
dfs(idx+1, leftRemain, rightRemain-1, string, list);
}
}
}