Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:java
"((()))", "(()())", "(())()", "()(())", "()()()"
给定n对括号,输出他们全部正确的组合算法
采用递归求解试数组
算法实现类app
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * Author: 王俊超 * Date: 2015-06-22 * Time: 11:13 * Declaration: All Rights Reserved !!! */ public class Solution { public List<String> generateParenthesis(int n) { // 保存结果的队列 List<String> result = new ArrayList<>(); // 括号数大于0 if (n > 0) { // 捛使用数组 char[] parentheses = new char[2 * n]; // 问题求解 solve(n, n, parentheses, result); } return result; } /** * @param left 剩余可用的左括号数 * @param right 剩余可用的右括号数 * @param parentheses 到上一次为止括号使用的状况 * @param result 存放结果的集合 */ public void solve(int left, int right, char[] parentheses, List<String> result) { // 剩下的括号数不能小于0,而且每次剩下的右括号数都不能小于左括号数 if (left < 0 || right < 0 || right < left) { // 什么都不用作 } // 左右括号都被使用完了 else if (left == 0 && right == 0) { result.add(new String(parentheses)); } // 能够使用 else { // 当前使用的位置 int idx = parentheses.length - left - right; // 使用左括号 parentheses[idx] = '('; // 递归求解 solve(left - 1, right, parentheses, result); // 使用右括号 parentheses[idx] = ')'; solve(left, right - 1, parentheses, result); } } }
描述测试
如今,有一行括号序列,请你检查这行括号是否配对。spa
输入.net
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符code
输出orm
每组输入数据的输出占一行,若是该字符串中所含的括号是配对的,则输出Yes,若是不配对则输出Noblog
样例输入
3 [(]) (]) ([[]()])
样例输出
No No Yes
[java] view plain copy
根据题意分析。咱们先取n=3.画出全部的状况。
代码
[java] view plain copy