C++括号生成

    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
    有效括号组合需满足:左括号必须以正确的顺序闭合。
    示例:
    输入:n = 3
    输出:["((()))","(()())","(())()","()(())","()()()"]

本题解用到的是回溯法,设定变量n,左括号open的数量小于n,当右括号close的数量小于左括号的时候可以加一个右括号。
答题思路紧抓一个要点,疯狂选括号,要么是左括号,要么是右括号。只要左括号有剩余就可以选,当剩下的右括号比左括号多时,才可以选右括号,否则就不能选。
代码如下:

#include<stdio.h>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
    
    
    void backtrack(vector<string>& ans, string& cur, int open, int close, int n) {
    
    
        if (cur.size() == n * 2) {
    
    
            ans.push_back(cur);
            return;
        }
        if (open < n) {
    
    
            cur.push_back('(');
            backtrack(ans, cur, open + 1, close, n);
            cur.pop_back();
        }
        if (close < open) {
    
    
            cur.push_back(')');
            backtrack(ans, cur, open, close + 1, n);
            cur.pop_back();
        }
    }
public:
    vector<string> generateParenthesis(int n) {
    
    
        vector<string> result;
        string current;
        backtrack(result, current, 0, 0, n);
        return result;
    }
    
};
 void main() {
    
    
		int n = 3;
        Solution S;
        std::vector<std::string> result = S.generateParenthesis(n);
        for ( int i = 0; i < result.size(); i++)
        {
    
    
            cout << result[i] << "\t" ;
            //printf("%s\t", result[i].c_str());
        }
	}

猜你喜欢

转载自blog.csdn.net/weixin_45358354/article/details/121589533