生成括号
题目描述:
n=3 3个左括号+3个右括号
合法:((())) (())() (()())
非法:)()()(
要求: 找出所有合法的括号情况
思路1: 暴力枚举
生成数组1,全部装左括号。
生成数组2,全部装右括号。
对数组1、数组2,里的内容进行排列组合,枚举出所有的情况。
对枚举出的情况进行合法检查,可用栈,遇到左括号,入栈;遇到右括号,弹出栈元素。
思路2: 用回溯,剪枝。
对于明显的非法情况,可直接排除剪枝:第一个是右括号,最后一个是左括号。
对于每个位置,可以放左括号,也可以放右括号。 使用数组依次递归下去。
Java 代码实现:
public class Main {
public List<String> get(int n) {
Set<String> res = new HashSet<>();
put(new String[2 * n], 0, "(", res);
return new ArrayList<>(res);
}
private void put(String[] arr, int putIndex, String content, Set<String> res) {
if (putIndex == arr.length) {
res.add(arrToString(arr));
return;
}
arr[putIndex] = content;
int leftCount = 0;
int rightCount = 0;
for (String s : arr) {
if (s == null) {
break;
}
if (s.equals("(")) {
leftCount++;
} else if (s.equals(")")) {
rightCount++;
}
}
if (illegalStatus(arr, leftCount, rightCount)) {
arr[putIndex] = null;
return;
}
put(arr, putIndex + 1, ")", res);
if (leftCount <= arr.length / 2) {
put(arr, putIndex + 1, "(", res);
}
arr[putIndex] = null;
}
private static String arrToString(String[] arr) {
StringBuilder temp = new StringBuilder();
for (String s : arr) {
temp.append(s);
}
return temp.toString();
}
private static boolean illegalStatus(String[] arr, int leftCount, int rightCount) {
return rightCount > leftCount || leftCount > arr.length / 2;
}
public static void main(String[] args) {
Main main = new Main();
List<String> strings = main.get(3);
for (String string : strings) {
System.out.println(string);
}
}
}