生成括号

原题

  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

"((()))", "(()())", "(())()", "()(())", "()()()"
  • 1
  • 1

 

题目大意

  给定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

 

  1. import java.util.Scanner;  
  2. import java.util.Stack;  
  3.   
  4. /** 
  5.  * @author Owner 
  6.  *  
  7.  */  
  8. public class Main {  
  9.   
  10.     public static void main(String[] args) {  
  11.         Scanner sc = new Scanner(System.in);  
  12.           
  13.         int n= sc.nextInt();//3条测试数据数据  
  14.           
  15.         Stack<Character> stack = null;  
  16.           
  17.         while(n!=0){  
  18.               
  19.             //从控制台读入一个测试字符串[]() [(])  
  20.             String str = sc.next();  
  21.             //若是该输入字符串为奇数,说明不匹配  
  22.             if(str.length() % 2 == 1){  
  23.                 System.out.println("No");  
  24.             }else{  
  25.                 //说明字符是偶数  
  26.                 stack = new Stack<Character>();  
  27.                   
  28.                 //遍历第一条测试字符串[]() [(])  
  29.                 for(int i=0;i<str.length();i++){  
  30.                     if(stack.isEmpty()){  
  31.                         //若是栈是空的  
  32.                         stack.push(str.charAt(i));  
  33.                     }else if(stack.peek() == '[' && str.charAt(i) == ']' || stack.peek() == '(' && str.charAt(i) == ')'){  
  34.                         //说明此时栈中字符不是空的,而且符合,  
  35.                         stack.pop();  
  36.                     }else{  
  37.                           
  38.                         stack.push(str.charAt(i));  
  39.                     }  
  40.                 }  
  41.                   
  42.                 if(stack.isEmpty()){  
  43.                     //若是栈是空的,说明括号匹配  
  44.                     System.out.println("Yes");  
  45.                 }else{  
  46.                     //说明栈不为空,括号不匹配  
  47.                     System.out.println("No");  
  48.                 }  
  49.             }  
  50.               
  51.             n--;  
  52.         }  
  53.           
  54.     }  
根据题意分析。咱们先取n=3.画出全部的状况。
 
代码
 
 

[java] view plain copy

print?在CODE上查看代码片派生到个人代码片

  1. package parenthesis;  
  2.   
  3. public class Parenthesis {  
  4.   
  5.     static void printParenthesis(int pos , int n , int open ,int close ,char[] buffer){  
  6.         //System.out.println("step"+pos+" open is : "+ open + "close is :" + close);  
  7.         //System.out.println(new String(buffer));  
  8.         if(close == n){  
  9.             //System.out.println("over");  
  10.             System.out.println(new String(buffer));  
  11.               
  12.             return;  
  13.         }  
  14.         if(open >close){  
  15.             buffer[pos]='}';  
  16.             printParenthesis(pos+1, n, open, close+1, buffer);  
  17.               
  18.         }  
  19.           
  20.         if(open <n){  
  21.             buffer[pos] = '{';  
  22.             printParenthesis(pos+1, n, open+1, close, buffer);  
  23.         }  
  24.           
  25.     }  
  26.     public static void main(String[] args) {  
  27.         // TODO Auto-generated method stub  
  28.         //System.out.println("012142");  
  29.         int  n = 4;  
  30.         char[] cs = new char[8];  
  31.         printParenthesis(0, 4, 0, 0, cs);  
  32.         //System.out.println("012143");  
  33.     }  
  34.   
  35. }  
相关文章
相关标签/搜索