https://leetcode.com/problems/generate-parentheses/
题目大意:给出n对小括号,求出括号匹配的情况,用列表存储并返回,例如:n=3时,答案应为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
解题思路:想到递归的思想,判断匹配成功(递归返回)的条件为:左右括号数保持一致并且括号字符串的长度等于2*n。
具体做法:需要的空间:字符串列表存储最后结果;string存储括号;n存储要求的括号对数;deep存储字符串长度;left存储已经存入的左括号个数;right存储已经存入的右括号个数。
解题技巧:递归实现时一般给出的函数难以进行递归,需要一个帮助函数,我们重新定义一个函数来实现递归。
注意:s.resize(s.size() - 1);该句话是为了实现回溯,考虑一下每次执行该句时上一句的递归一定已经实现了,所以需要去除最后一个括号
class Solution { public: vector<string> generateParenthesis(int n) { vector<string> result; string s; if(n > 0) { generateParenthesisHelper(result, s, n, 0, 0, 0); } return result; } void generateParenthesisHelper(vector<string>& result, string &s, int n, int deep, int left, int right) { if(deep == 2*n) { result.push_back(s); return; } if(left < n) { s.push_back('('); generateParenthesisHelper(result, s, n, deep + 1, left + 1, right); s.resize(s.size() - 1); } if(right < left) { s.push_back(')'); generateParenthesisHelper(result, s, n, deep + 1, left, right +1); s.resize(s.size() - 1);
} } };