22. 括号生成

文章目录

    • leetcode22:[22. 括号生成](https://leetcode-cn.com/problems/generate-parentheses/)
      • 题目描述
      • solution idea
        • 暴力搜素
        • 回溯法(backtrack)
      • Tricks
      • 参考文献

leetcode22:22. 括号生成

题目描述

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。Example

输入:n=3
输出:
[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

solution idea

暴力搜素

  • 先将比较特殊的情况单独处理(n=0和n=1),直接返回结果;
  • 针对其他情况使用暴力求解的方法:
    暴力求解即:列出所有的可能情况,再将不合格的结果剔除。
    罗列所有的可能情况使用next_permutation()这个函数;注意:因为每个结果的第一个元素一定是‘(’,所以在重新排列时,第一个元素不参与;
class Solution {
public:
/*
** 暴力搜索
*/
    vector generateParenthesis(int n) {
        vector res;
        if (n==0) return res;
        else if (n==1)
        {
            res.push_back("()");
            return res;
        }
        string s="";
        for (int i=0;i

回溯法(backtrack)

  • 只有在我们知道序列仍然保持有效时才添加 ‘(’ or ‘)’,可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,

  • 如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。

class Solution {
public:
/*
** 回溯法
*/
    vector generateParenthesis(int n) {
        vector res;
        backtrack("",0,0,res,n);
        return res;
    
    }
    void backtrack(string s, int l, int r, vector& res, int n)
    {
        if (s.size()==(2*n)) res.push_back(s);
        if(l

Tricks

std::next_permutation

Rearranges the elements in the range [first,last) into the next lexicographically greater permutation.

default (1)	
template 
  bool next_permutation (BidirectionalIterator first,
                         BidirectionalIterator last);
custom (2)	
template 
  bool next_permutation (BidirectionalIterator first,
                         BidirectionalIterator last, Compare comp);

std::sort

Sorts the elements in the range [first,last) into ascending order.

default (1)	
template 
  void sort (RandomAccessIterator first, RandomAccessIterator last);
custom (2)	
template 
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

参考文献

  1. c++ prime 第5版
  2. std::next_permutation
  3. std::sort

你可能感兴趣的:(leetcode,C++/C)