LintCode刷题——生成括号
Posted Revenent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LintCode刷题——生成括号相关的知识,希望对你有一定的参考价值。
427-生成括号
题目:给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果。
样例:给定 n = 3
, 可生成的组合如下:"((()))", "(()())", "(())()", "()(())", "()()()"
算法:对于给定的n,定义一个result字符串,当字符串中的\'(\'的数目大于\')\'的数目,则该字符串中可以拼接\'(\'或\')\';
否则,result中只能拼接\'(\'。递归终止条件为左括号数目与n相同,此时只能在result中插入右括号。递归表达式为:
T(i+1) = T(i) + \'(\' 当i<n时;
T(i+1) = T(i) + \')\' 当i<n 且result中\'(\'数多于\')\';
代码:
public class Solution { /** * @param n n pairs * @return All combinations of well-formed parentheses */ public void generateBracket(ArrayList<String> result, int n, int lBraNums, int rBraNums, String item ){ if(lBraNums==n){ for(int i=0;i<n-rBraNums;i++){ item+=\')\'; } result.add(item); return; } else{ generateBracket(result,n,lBraNums+1,rBraNums,item+\'(\'); if(lBraNums>rBraNums){ generateBracket(result,n,lBraNums,rBraNums+1,item+\')\'); } } } public ArrayList<String> generateParenthesis(int n) { // Write your code here ArrayList<String> result = new ArrayList<String>(); generateBracket(result,n,0,0,""); return result; } }
算法复杂度:
由于T(i)由T(i-1)的两种方式决定,故算法复杂度为O(2^n);
T(i+1) = 2T(i) + O(1) = 2(2T(i-1) + O(1) ) + O(1) = ....
所以T = O(2^n);
以上是关于LintCode刷题——生成括号的主要内容,如果未能解决你的问题,请参考以下文章