【LeetCode】22. 括号生成 结题报告 (C++)

原题地址:https://leetcode-cn.com/problems/generate-parentheses/description/

题目描述:

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

例如,给出 = 3,生成结果为:

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

解题方法:

    void fun(int x, stack stk, int n, string& s, vector& ans)
    {   
            if(x == n && stk.empty()){//如果入栈完毕了,且也栈空了,就输出此出栈顺序          这个是递归的结束条件
            ans.push_back(s);
            s = "";
        }
        else//以上其中一项未完成
        {
            stack s1=stk;
            stack s2=stk;
            //选择入栈
            if (x <  n)//如果是未全部入栈                       
            {
                 s1.push(x+1);//      继续入栈
    	         string tmp = s + "(";
		 fun(x+1, s1, n, tmp, ans);//执行下一个操作
            }
            //选择出栈 
            if (!s2.empty())//如果栈不空,并且,入栈元素不是最后一个
            {   //当到最后一个字符入栈之后,上面已经执行先出栈了
		 string tmp = s + ")";
		 s2.pop();//出栈
                 fun(x, s2, n, tmp, ans);
            }
        }
    }
    
    vector generateParenthesis(int n) {
        vector ans;
        stack in;
        string s = ""; 
        fun(0, in, n, s, ans);
        return ans;
    }

这道题等价于根据入栈顺序输出所有的出栈顺序。

解题方法采用的是递归,使用两个栈,一个负责入栈存数据,另一个负责出栈弹出数据。在入栈和出栈的同时,添加左括号和右括号。在递归的过程中,过程比较复杂,很容易出错,这里的字符串数据需要进行保留,以防数据出错。

你可能感兴趣的:(【LeetCode】22. 括号生成 结题报告 (C++))