输出N对括号所有合法的组合

卡特兰数问题
通过剩余左括号和右括号的数来解决:
1.如果剩余左括号的数比右括号数多,则为非法的括号对;
2.如果剩余左括号和右括号数相等,则只能增加一个左括号;
3.如果剩余的左括号数小于右括号数,则可以增加左括号或右括号。

#include 
#include 
#include
using namespace std;
void generate(int n, int l, int r,string str, vector<string>& res) {
    if (n == 0 || l > r || l < 0 || r <0)
        return;
    if (l == 0 && r == 0) {
        res.push_back(str);
        return;
    }
    if (l <= r && l != 0) 
        generate(n, l-1, r, str+ '(', res);
    if (l < r) 
        generate(n, l , r-1, str + ')', res);
    return;
}
int main() {
    int n;
    cin >> n;
    vector <string> vec;
    string str;
    generate(n, n, n,str,  vec);
    for (int i = 0; i < vec.size() - 1; i++){
        cout << vec[i];
        cout << ',';
    }
    cout << vec[vec.size() - 1];
    return 0;
}

你可能感兴趣的:(数据结构和算法)