思路:回溯
- 树的左指针表示
(,树的右指针表示),分别用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; }};