22. 括号生成

22. 括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

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

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

思路:

​ 使用回溯算法,那么我们先去考虑终止条件,n对括号,就是你输出的字符串一共要有2n个元素,并且这些元素的括号是合法的。那么如何判断括号合法呢,明显可以使用栈,入栈'(',如果遇到')'就出栈,如果栈为空就说明没有左括号自然就非法。那么只要在使用一个temp字符串记录一下结果就好。

class Solution {
public:
    vector<string>ans;
    stack<char>st;
    string temp="";
    vector<string> generateParenthesis(int n) {
        backtrack(0,2*n);
        return ans;
    }
    void backtrack(int index,int m){
        //base case
        if(index==m){
            if(st.empty()){
                ans.push_back(temp);
                return;
            }else{
                return;
            }
        }

        //选择左括号
        st.push('(');
        temp+='(';
        backtrack(index+1,m);
        //撤销选择
        st.pop();
        temp.pop_back();
        //应该选择右括号  但是先判断能不能加右括号
        if(st.empty())return ;//栈为空
        st.pop();//有左括号 那就弹出左括号
        temp+=')';
        backtrack(index+1,m);
        st.push('(');
        temp.pop_back();
    }
};
posted @ 2022-05-12 08:58  BailanZ  阅读(36)  评论(0编辑  收藏  举报