您的问题是使用加泰罗尼亚数字:Cn 是用括号括起来的关联表达式的数量。它也是具有 n+1 个叶子的可能全二叉树的数量(全二叉树 = 一棵树,其中每个节点正好有 2 个子节点,或者是一个叶子)。
因此,可以使用递归来生成所有组合:
#include <iostream>
#include <string>
#include <vector>
typedef std::vector<std::string> str_vector;
// Combine u and v, and add the result to w
// u and v contains all possible combinations with respectively m and n - m letters
// So w will contain combinations with n letters
void combine(str_vector& w, const str_vector& u, const str_vector& v)
{
for(unsigned int t = 0; t < u.size(); t++)
for(unsigned int i = 0; i < v.size(); i++)
w.push_back("(" + u[t] + v[i] + ")");
}
// The function resolving our problem
// It output an array containing all possible combinations
// with n letters, starting with startLetter
str_vector problem(unsigned int n, char startLetter)
{
if(n == 1)
// Only one combination with one letter.
// Array with 1 string which contains only one character
return str_vector(1,std::string(1,startLetter));
else
{
str_vector w;
// Get all combinations for n-1 letters, and add them to w
for(unsigned int t = 1; t < n; t++)
combine(w, problem(t, startLetter), problem(n - t, startLetter + (char)t));
return w;
}
}
int main()
{
// Get all possible combinations with 4 letters
const str_vector& r = problem(4,'a');
// Print all solutions
for(unsigned int t = 0; t < r.size(); t++)
std::cout << r[t] << "\n";
}
这段代码不是最快的,也不是最优化的。但是,我认为它非常具有可读性。
对于组合数,公式为:
这可以简化为:
(2n)!
Cn = ---------
n!² (n+1)
计算 Cn 为您提供具有 n+1 个标识符的组合数。但是,它并没有为您提供解决方案。