Leetcode:Question22--Generate Parentheses

题目描述

这里写图片描述

解题思路

  1. 拿到这道题,首先思考的是哪些情况下括号匹配会出现错误。题目只列出了正确的括号匹配情况,因此需要自己观察不匹配的情况。
  2. 首先可以注意到的是,左括号永远是作为开头出现,而右括号永远是作为末尾出现。除了两端之外,右括号的出现必须要求前面已经有左括号。因此一开始的想法是构建一个栈来存储左括号,当往字符串中写入一个左括号时,向栈中push一个左括号,当栈中括号pop出来时,向字符串中写入一个右括号。因此就能够保证,右括号和左括号匹配。
  3. 另外就是如何遍历所有情况的问题。除了头和尾,假如左括号的数没有达到上界,那么既可以加左括号也可以加右括号。假如左括号数量已满,那么就只能添加右括号。由于每种情况都是建立在前面情况的基础上,所以用递归比较合适
  4. 最后就是设定一个值来存储所有字符串,因此声明了一个private的对象。
  5. 做到这里发现,其实栈的作用只是用来记录左右括号的数目,因此完全可以设定一个变量来记录而不需要维护一个栈。因此在增加左右括号时只需要满足以下两种情况
    • 已存在的左括号数大于右括号数
    • 左括号数小于要求的数目
    • 以左括号开头,右括号结尾

代码分析

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        string s = "";
        addBracket(0, 0, n, s);
        return result;
    }

    void addBracket(int left, int right, int max, string s) {
        if (s.size() == max * 2)
        {
            result.push_back(s);
            return;
        }
        else {
            if (left < max) {
                addBracket(left + 1, right, max, s + '(');   
            }
            if (right < left) {
                addBracket(left, right + 1, max, s + ')');
            }
        }

    }
private:
    vector<string> result;
};

此题采用了C++ 语言,通过使用递归完成。在递归过程的代码编写中出现了一点错误。一开始写的是

    /-----/
        else {
            if (left < max) {
                addBracket(++left, right, max, s + '(');   
            }
            if (right < left) {
                addBracket(left, ++right, max, s + ')');
            }
        }

    /----/

结果出现错误。debug发现,当递归到字符串为“ (() ” 时,左括号数量显示为3,可见,在从上一步” ((())) ” 递归过程返回到这一步时,左括号数先进行了一次递增。

接下来我又尝试了一下 将自增放在右边(显然已经知道是错的),发现什么都没有输出。debug发现,在递归进入下一层函数时,是先进入函数在进行加1,因此left和right的值一直是0。

可见,在递归时,不能改变所在层的变量的值。

猜你喜欢

转载自blog.csdn.net/huangbx_tx/article/details/82717241