思路:回溯
- 树的左指针表示
(,树的右指针表示),分别用left和right计数,如果left < num,那么允许走左边;如果left > right,那么允许走右边。每个节点一共两个分支。 ss.pop_back()体现了回溯的思想,否则不会往上走。
代码:
class Solution {public:    void dfs(int n, int cur_index, vector<string>& res, string& ss, int left, int right) {        if (cur_index == 2 * n) {            res.push_back(ss);            return;        }        if (left < n) {            ss.push_back('(');            dfs(n, cur_index + 1, res, ss, left + 1, right);            ss.pop_back();        }        if (right < left) {            ss.push_back(')');            dfs(n, cur_index + 1, res, ss, left, right + 1);            ss.pop_back();        }    }    vector<string> generateParenthesis(int n) {        vector<string> res;        string ss;        dfs(n, 0, res, ss, 0, 0);        return res;    }};