LeetCode 22. Generate Parentheses

LeetCode 22. Generate Parentheses


题目描述:

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

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

题目理解:

给定一个数字,代表有这些个左括号,看看和右括号有多少种匹配方法,输出所有可能性。

看到例子中给的,每个输出左括号后下次有两种选择,可以继续添加,也可以右括号匹配,关键是要输出所有可能的情况,而不是某个最优解,所以自然而然就想到要回溯,并且还要用某个东西把这些结果全部存储起来。对于我自己来说,这就产生了两个问题,一是怎么回溯,另一个是怎么存储所有结果。刚开始想回溯,就按照一种类似栈的思想来,但是这种动态栈却又没有办法实现出来,就陷入停止,不知道该怎么做。

之后参考了solution里面的java解法,突然就觉得自己不灵活,可以用整数之间的比较模拟是否为栈是否为空呀,也可以用另一对整数之间的关系比较模拟是否还能继续添加左边括号呀~但是java里面的若声明一个ans作为结果变量,放在参数里面修改后的结果会保存,但是再c++里面不能保存,所以我就用了个全局变量来解决这个问题。注意再传递参数时对参数的修改。

class Solution {
public:
    vector<string> ans;
    vector<string> generateParenthesis(int n) { 
        string tmp="";
        backtrack(tmp,0,0,n);
        return ans;
    }
    //可以利用数字变量的比较来模拟自己的想法
    void backtrack(string tmp,int left,int right,int max){
        if(tmp.size()==max*2){
            //cout<
            ans.push_back(tmp);
            return;
        }
        if(left//如果还可以再出现左边括号
            backtrack(tmp+"(",left+1,right,max);
        }
        if(right//模拟左边括号再栈里面还有剩,right与left的大小比较,等价于left是否为0,这里如果用left比较那么上面的比较就不能用了。
            backtrack(tmp+")",left,right+1,max);
        }
    }
};

你可能感兴趣的:(leetcode,机考)