如何通过回溯算法生成所有括号组合?

摘要:📘 回溯法:生成合法括号组合(n 对) 🧩 功能说明 这段代码的功能是:输入一个整数 n,输出所有可能的 n 对合法括号组合。 合法括号组合的定义是:括号必须成对匹配、顺序合理
📘 回溯法:生成合法括号组合(n 对) 🧩 功能说明 这段代码的功能是:输入一个整数 n,输出所有可能的 n 对合法括号组合。 合法括号组合的定义是:括号必须成对匹配、顺序合理,不能出现像 ())( 这样的无效形式。 🧠 核心算法:回溯法(Backtracking) 通过递归地尝试每一个可能的分支选择(放左括号或右括号),构造出所有合法的组合路径。 🔍 类定义和主函数结构 #include <iostream> #include <vector> #include <climits> #include <cmath> #include <unordered_set> using namespace std; class Solution { public: vector<string> res; void backtrack(int n, int left, int right, string &temp) { if (left == n && right == n) { res.push_back(temp); return; } if (left < n) { temp += '('; backtarck(n, left + 1, right, temp); temp.pop_back(); } if (left > right) { temp += ')'; backtarck(n, left, right + 1, temp); temp.pop_back(); } } }; int main(int argc, char const *argv[]) { Solution solution; int n; cin >> n; string temp; solution.backtrack(n, 0, 0, temp); for (string s : solution.res) { cout << s << '\n'; } return 0; } 🧱 回溯逻辑详解(3 个 if 条件) ✅ 1. if (left == n && right == n) 含义:左右括号都已放满,构造完成。 作用:将当前字符串 temp 加入结果。 注意:必须放在最前面,作为递归终止条件。 ✅ 2. if (left < n) 含义:左括号还没放满,可以尝试放 '('。 递归前:temp += '(' 递归后:temp.pop_back() 回退操作 ✅ 3. if (left > right) 含义:当前已有多余的左括号,可以安全地放一个右括号。 保证:括号不会不合法(比如 ()))。 递归逻辑与左括号类似。 🔄 条件顺序是否可以交换? if (left == n && right == n) 必须在最前,作为终止条件。 left < n 和 left > right 是并行探索路径,可以交换顺序,不影响最终结果,只影响输出的排列顺序。
阅读全文