根据题目描述,n代表括号的对数,需要根据括号的数量生成每一种不同的括号组合。
解题思路:这道题可以利用递归回溯的方法把所有可能的组合找出来。具体操作是先根据n的大小确认左括号和括号的数量,左括号的数量=右括号的数量=n,刚进入递归函数的时候左括号的数量是等于右括号的数量的,此时可以在字符串中+=一个‘( ’,那么左括号的数量就减1;此时字符串中有一个‘( ’,则我们可以选择继续插入‘( ’,也可以选择插入‘ )’,这个条件等价于左括号的数量小于右括号的数量,由于第一次是左括号数量=右括号数量插入了‘( ’,所以可以合并以上两种情况,即当左括号的数量小于等于右括号的数量的时候,我们既可以插入‘( ’,也可以插入‘ )’;由于左括号可以一直插入,直到数量为0,所以当左括号数量为0时我们就要插入右括号了,直到右括号的数量也为0,即左括号数量=右括号数量=0时,说明得到了一个配对合法的字符串,把它插入到vector<string> v 中,由于以上算法时通过递归完成的,所以完成了一个字符串的配对之后会自动回溯找下一个可能匹配的字符组合。
参考代码如下:已配上详细的注释,相信各位小伙伴都能够看懂并学会这道题的哈。
class Solution { public: void _generateParenthesis(vector<string>& v, string str, int left, int right) { //左右括号的数量都等于0,说明左右括号都合法用完了,尾插到v中 if (left == 0 && right == 0) { v.push_back(str); } //如果左括号已经用完了,那么接下来只能把所有的右括号都插入到该字符串中去,形成一个合法的括号组合 else if (left == 0 && right > 0) { //字符组合串中添加')',左括号数量right-1 _generateParenthesis(v, str + ')', left, right - 1); } //如果左括号数量<=右括号的数量,那么我们既可以插入'(',也可以插入')', //例如:我可以连续入三个左括号"(((",再入三个")))"的,由于这里是递归, //所以会把所有的组合都匹配出来 else if (left <= right) { //字符组合串中添加'(',左括号数量left-1 _generateParenthesis(v, str + '(', left - 1, right); //字符组合串中添加')',左括号数量right-1 _generateParenthesis(v, str + ')', left, right - 1); } } vector<string> generateParenthesis(int n) { vector<string> v; //str为存放可能合法的括号组合的字符串 string str; _generateParenthesis(v, str, n, n); return v; } };