zoukankan      html  css  js  c++  java
  • generate parentheses(生成括号)

    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:

    [
      "((()))",
      "(()())",
      "(())()",
      "()(())",
      "()()()"
    ]

    给定一个数字表示有多少对括号,根据这些括号生成括号集合。

    这个题比较有难度。运用到了回溯算法。搞不太懂。

    往字符串中加括号,在符合要求的情况下,可以加左括号或者右括号,所以在符合要求下对这两种情况进行尝试,在不符合时,就直接返回上一层继续探索(这里不作处理也就是返回上一次调用了)

    题目给定n表示n对括号,就有n个左括号和n个右括号,我们定义两个变量left和right分别表示字符串中左括号的个数和右括号的个数。如果字符串中右括号的个数大于左括号的个数,这就会出现)(的情况,所以不作处理,直接返回。当左括号的个数小于n时,这个时候就可以添加左括号,右括号个数小于左括号时,可以添加右括号。也就是说,两种情况都可以,所以都进行尝试。当字符串长度和n*2相等时就可以添加到List中了。

    class Solution {
        public List<String> generateParenthesis(int n) {
            /*
            
            */
            List<String> list=new ArrayList<>();
            helper(list,"",0,0,n);
            return list;
        }
        /*
            求n时的括号组合。
            left表示此时字符串中左括号的个数,right表示字符串中右括号的个数,
        */
        public void helper(List<String> list,String str,int left,int right,int n){
            if(str.length()==n*2){
                list.add(str);
                return ;
            }
            
            //当left小于n时,表示还可以添加左括号,当left大于right时,表示可以添加右括号
            //注意:该字符串中,左括号的个数不可能小于右括号的个数,因为这样就是无效的输出。
            if(left<n)
                helper(list,str+"(",left+1,right,n);
            if(left>right)
                helper(list,str+")",left,right+1,n);
        }
    }
    
    
  • 相关阅读:
    verilog RTL编程实践之四
    TB平台搭建之二
    hdu3466 Proud Merchants
    poj2411 Mondriaan's Dream (用1*2的矩形铺)
    zoj3471 Most Powerful
    poj2923 Relocation
    hdu3001 Travelling
    poj3311 Hie with the Pie
    poj1185 炮兵阵地
    poj3254 Corn Fields
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/8093578.html
Copyright © 2011-2022 走看看