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