编程题
题目描述 给出一个正整数n,请给出所有的包含n个’(‘和n个’)‘的字符串,使得’(‘和’)‘可以完全匹配。
例如:’(())()’,’()()()’ 都是合法的; '())()('是不合法的。
请按照__字典序__给出所有合法的字符串。
输入描述: 输入为1个正整数
输出描述: 输出为所有合法的字符串,用英文逗号隔开
- 输入
2
输出
(()),()()
java版
/**
* Time: 2019-01-25 Author: snowy
* 链接:https://www.nowcoder.com/questionTerminal/3690a506d0374981863ca649d97b81b7?orderByHotValue=1&page=1&onlyReference=false
* 来源:牛客网
* 【题目描述】 给出一个正整数n,请给出所有的包含n个'('和n个')'的字符串,使得'('和')'可以完全匹配。
* 例如:
* '(())()','()()()' 都是合法的;
* '())()('是不合法的。
* 请按照__字典序__给出所有合法的字符串。
* 输入描述: 输入为1个正整数
* 输出描述: 输出为所有合法的字符串,用英文逗号隔开
* */
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class FindLegalString {
public static List<String> findLegalString(int num) {
List<String> res = new ArrayList<>(); // 用于存储结果
dfsHelper(0, num, num, "", res, num);
return res;
}
/**
* @param cur_length: 当前字符串的长度
* @param left: 当前左括号的个数
* @param right: 当前右括号的个数
* @param str: 当前字符串
* @param res: 当前字符串的组
* @param num: 需要的左括号和右括号的个数
* */
public static void dfsHelper(int cur_length, int left, int right, String str, List<String> res, int num) {
if (cur_length == 2 * num) { // 当前字符串的长度为2*num时就将其添加到res中
res.add(str);
return;
}
// 剩余的右括号的个数一个要大于等于左括号的个数
if (left > 0) // 只要还有左括号就能先添加左括号
dfsHelper(cur_length + 1, left - 1, right, str+"(", res, num);
if (right > left) // 只有当右括号的个数大于左括号的时候才能想当前字符串中添加右括号
dfsHelper(cur_length + 1, left, right - 1, str+")", res, num);
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
int num = input.nextInt();
List<String> res = findLegalString(num);
for (int i = 0; i < res.size(); i ++) {
System.out.print(res.get(i));
if (i != res.size() - 1)
System.out.print(",");
}
System.out.println();
}
}
}