先上代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<String>();
backtrack("", res, n, n);
return res;
}
public static void backtrack(String sublist, List<String> res, int left, int right) {
if (left == 0 && right == 0) {
res.add(sublist);
return;
}
if (left > right) {
return;
}
if (left > 0) {
backtrack(sublist + "(", res, left - 1, right);
}
if (right > 0) {
backtrack(sublist + ")", res, left, right - 1);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Please,Input: ");
int n = in.nextInt();
List<String> result = new ArrayList<String>();
result = generateParenthesis(n);
System.out.println(result);
}
}
典型的回溯问题。
思路如下:
if (左右括号都已用完) {
加入解集,返回
}
//否则开始试各种选择
if (还有左括号可以用) {
加一个左括号,继续递归
}
if (右括号小于左括号) {
加一个右括号,继续递归
}