专门做dm单的网站,电商网站建设特色,中国网络排名前十名,爱奇艺做视频网站的数字 n 代表生成括号的对数#xff0c;请你设计一个函数#xff0c;用于能够生成所有可能的并且有效的括号组合。
示例 1#xff1a;输入#xff1a;n 3 输出#xff1a;[((())),(()()),(())(),()(()),()()(…数字 n 代表生成括号的对数请你设计一个函数用于能够生成所有可能的并且有效的括号组合。
示例 1输入n 3 输出[((())),(()()),(())(),()(()),()()()]
示例 2输入n 1 输出[()]
回溯法
class Solution {
public:vectorstring ret;string s;//存储某一个组合//left:剩余的左括号数量//right:剩余的右括号数量void dfs(int left,int right,string s){if(!left!right){ret.push_back(s);return;}if(left){s.push_back(();dfs(left-1,right,s);s.pop_back();}if(rightleftright){s.push_back());dfs(left,right-1,s);s.pop_back();}}vectorstring generateParenthesis(int n) {dfs(n,n,s);return ret;}
};
执行顺序
dfs(2, 2, ) // 初始调用
├── dfs(1, 2, () // 选择左括号
│ ├── dfs(0, 2, (() // 选择左括号
│ │ ├── dfs(0, 1, (()) // 选择右括号
│ │ │ ├── dfs(0, 0, (())) // 选择右括号
│ │ │ │ ├── ret.push_back((())) // 保存结果
│ │ │ │ └── 回溯: s.pop_back() // s (()
│ │ │ └── 回溯: s.pop_back() // s ((
│ │ └── 回溯: s.pop_back() // s (
│ ├── dfs(1, 1, ()) // 选择右括号
│ │ ├── dfs(0, 1, ()() // 选择左括号
│ │ │ ├── dfs(0, 0, ()()) // 选择右括号
│ │ │ │ ├── ret.push_back(()()) // 保存结果
│ │ │ │ └── 回溯: s.pop_back() // s ()(
│ │ │ └── 回溯: s.pop_back() // s ()
│ │ └── 回溯: s.pop_back() // s (
│ └── 回溯: s.pop_back() // s
└── // dfs(2, 1, )) - invalid不执行dfs(2, 2, )/ \dfs(1, 2, () // dfs(2, 1, )) - invalid因为左括号数量不能大于右括号数量/ \dfs(0, 2, (() dfs(1, 1, ())| |dfs(0, 1, (()) dfs(0, 1, ()()| |
dfs(0, 0, (())) dfs(0, 0, ()())| |
ret.push_back((())) ret.push_back(()())