[回溯]leetcode22:括号生成(medium)

题目:
[回溯]leetcode22:括号生成(medium)_第1张图片
题解:

  • 回溯法
  • 本题使用n来表示左括号可以使用个数,用index来表示右括号可以使用的次数。在每使用掉一个左括号时,对应可以使用右括号的数量+1,因为这样可以保证左右括号是对等的(也就是先有左括号,然后再有右括号,这样就避免无效括号了)。
  • 当可以使用可以左右括号个数为0时,表示已经生成一个有效的括号组合。
    [回溯]leetcode22:括号生成(medium)_第2张图片

代码如下:

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        if(n==0)return {};
        vector<string> result;
        backtrack(result,"",n,0);
        return result;
    }
    
    /*n表示左括号可以使用的个数,index表示右括号可以使用的个数
    要满足左括号的可以使用的个数要小于右括号可以使用的个数*/
    void backtrack(vector<string>& result,string track,int n,int index)
    {
        /*可以使用的左右括号为0时,表示生成一个有效的括号组合*/
        if(index==0&&n==0)result.push_back(track);
        else{
            /*每使用一个左括号,就要对应生成一个需要使用的右括号*/
            if(n>0)backtrack(result,track+"(",n-1,index+1);
            /*可以使用的右括号数大于0,则用来完成左括号的匹配*/
            if(index>0)backtrack(result,track+")",n,index-1);
        }
    }
    
};

你可能感兴趣的:(leetcode刷题,#,回溯)