合理括号序列回溯法

#include <iostream>
#include <vector>
#include <stack>
#include <set>
#include <string>
#include <algorithm>
using namespace std;//L为左括号数,R为右括号数,限制条件为L<n&&R<L才是正确的括号序列
void traceback(string& t, vector<string>& ans, int L, int R, int n) {
    if (L==n&&R==n) {
        ans.push_back(t);
        return;
    }
    if (L < n) {
        t += '(';
        traceback(t, ans, L + 1, R, n);
        t = t.substr(0, t.size() - 1);
    }
    if (R < L) {
        t += ')';
        traceback(t, ans, L, R + 1, n);
        t = t.substr(0, t.size() - 1);
    }
    
}
vector<string> generateParenthesis(int n) {
    int L = 0, R = 0;
    string t;
    vector<string> ans;
    traceback(t, ans, 0, 0, n);
    return ans;
}
int main(void) {
    vector<string> ans=generateParenthesis(3);
    for (int i = 0; i < ans.size();i++) {
        cout << ans[i] << endl;
    }
	return 0;
}
posted @ 2021-11-18 20:06  Zupernova  阅读(42)  评论(0编辑  收藏  举报