2022.02.17括号生成
(题目来源:https://leetcode-cn.com/problems/generate-parentheses/ )
题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
样例输入
n = 3
样例输出
["((()))","(()())","(())()","()(())","()()()"]
数据规模和约定
1 <= n <= 8
思路
思路一:
通过dfs生成所有可能的括号字符串,最后在通过一个函数判断括号是否符合。
代码如下:
List<String> res = new ArrayList<String>();
boolean fit(String s) {
Stack<Character> stack = new Stack<>();
int i = 0;
while(i < s.length()) {
if(s.charAt(i) == '(') stack.push(s.charAt(i++));
else {
if(stack.isEmpty() || stack.pop() != '(') return false;
i++;
}
}
return stack.isEmpty();
}
void dfs(int ln, int rn, StringBuffer sb) {
if(ln < 0 || rn < 0) return;
if(ln == 0 && rn == 0) {
System.out.println(sb);
if(fit(sb.toString())) res.add(sb.toString());
return;
}
dfs(ln-1, rn, new StringBuffer(sb).append("("));
dfs(ln, rn-1, new StringBuffer(sb).append(")"));
}
public List<String> generateParenthesis(int n) {
dfs(n-1, n, new StringBuffer("("));
return res;
}
思路二
由于只有一种括号,所以只需要满足一下条件就是符合条件的字符串:
对于每个位置,其前面左括号都大于等于右括号。并且最终左括号的个数和右括号的个数相等,为n。