生成括号
2016-12-13 00:00
106 查看
原题
Givennpairsofparentheses,writeafunctiontogenerateallcombinationsofwell-formedparentheses.Forexample,givenn=3,asolutionsetis:
"((()))","(()())","(())()","()(())","()()()"
1
1
题目大意
给定n对括号,输出他们所有正确的组合解题思路
采用递归求解试代码实现
importjava.util.ArrayList; importjava.util.LinkedList; importjava.util.List; /** *Author:王俊超 *Date:2015-06-22 *Time:11:13 *Declaration:AllRightsReserved!!! */ publicclassSolution{ publicList<String>generateParenthesis(intn){ //保存结果的队列 List<String>result=newArrayList<>(); //括号数大于0 if(n>0){ //捛使用数组 char[]parentheses=newchar[2*n]; //问题求解 solve(n,n,parentheses,result); } returnresult; } /** *@paramleft剩余可用的左括号数 *@paramright剩余可用的右括号数 *@paramparentheses到上一次为止括号使用的情况 *@paramresult存放结果的集合 */ publicvoidsolve(intleft,intright,char[]parentheses,List<String>result){ //剩下的括号数不能小于0,并且每次剩下的右括号数都不能小于左括号数 if(left<0||right<0||right<left){ //什么都不用做 } //左右括号都被使用完了 elseif(left==0&&right==0){ result.add(newString(parentheses)); } //可以使用 else{ //当前使用的位置 intidx=parentheses.length-left-right; //使用左括号 parentheses[idx]='('; //递归求解 solve(left-1,right,parentheses,result); //使用右括号 parentheses[idx]=')'; solve(left,right-1,parentheses,result); } } }
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
样例输出
[java]
importjava.util.Scanner;
importjava.util.Stack;
/**
*
*
*/
publicclassMain{
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
intn=sc.nextInt();//3条测试数据数据
Stack<Character>stack=null;
while(n!=0){
//从控制台读入一个测试字符串[]()[(])
Stringstr=sc.next();
//如果该输入字符串为奇数,说明不匹配
if(str.length()%2==1){
System.out.println("No");
}else{
//说明字符是偶数
stack=newStack<Character>();
//遍历第一条测试字符串[]()[(])
for(inti=0;i<str.length();i++){
if(stack.isEmpty()){
//如果栈是空的
stack.push(str.charAt(i));
}elseif(stack.peek()=='['&&str.charAt(i)==']'||stack.peek()=='('&&str.charAt(i)==')'){
//说明此时栈中字符不是空的,并且符合,
stack.pop();
}else{
stack.push(str.charAt(i));
}
}
if(stack.isEmpty()){
//如果栈是空的,说明括号匹配
System.out.println("Yes");
}else{
//说明栈不为空,括号不匹配
System.out.println("No");
}
}
n--;
}
}
}
[java]
packageparenthesis;
publicclassParenthesis{
staticvoidprintParenthesis(intpos,intn,intopen,intclose,char[]buffer){
//System.out.println("step"+pos+"openis:"+open+"closeis:"+close);
//System.out.println(newString(buffer));
if(close==n){
//System.out.println("over");
System.out.println(newString(buffer));
return;
}
if(open>close){
buffer[pos]='}';
printParenthesis(pos+1,n,open,close+1,buffer);
}
if(open<n){
buffer[pos]='{';
printParenthesis(pos+1,n,open+1,close,buffer);
}
}
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//System.out.println("012142");
intn=4;
char[]cs=newchar[8];
printParenthesis(0,4,0,0,cs);
//System.out.println("012143");
}
}
相关文章推荐
- Leetcode:Generate Parentheses 生成有效括号对
- Leet Code 22 Generate Parentheses - 生成括号 - Java
- 给定n对括号,编写一个函数来生成正确括号的所有组合。
- 代码的优化过程: 生成括号 Generate Parentheses
- [LintCode] Generate Parentheses 生成括号
- LeetCode | Generate Parentheses(生成括号)
- 生成n对括号的所有合法排列
- 生成括号
- lintcode--生成括号
- [LeetCode系列]括号生成问题
- leetcode-22-生成括号
- [Lintcode]Generate Parentheses 生成括号
- 生成括号
- LeetCode 22 Generate Parentheses(生成括号)
- LintCode:生成括号
- 随机生成四则运算式及答案(含括号)
- Generate Parentheses 生成括号-- LintCode题解
- 生成括号
- 427 - 生成括号
- LeetCode 22. Generate Parentheses(生成括号)