LeetCode 22:Generate Parentheses的递归,回溯两种解法

Generate Parentheses

Given n pairs of parentheses, write a function to generate all
combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

“((()))”, “(()())”, “(())()”, “()(())”, “()()()”

递归

class Solution {
public:
    void unguarded_generate(vector<string> &result, string &curr, int m, int n)
    {
        // m,n分别表示未放置的'(',')'的数量
        if(m==0 && n==0)
        {
            result.push_back(curr);
            return;
        }
        if(m>0) // 任何情况m一定小于等于n
        {
            curr.push_back('(');
            unguarded_generate(result, curr, m-1, n);
            curr.pop_back();
        }
        if(m// 此时可以放), n-1后仍满足m<=n
        {
            curr.push_back(')');
            unguarded_generate(result, curr, m, n-1);
            curr.pop_back();
        }
    }
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        string curr;
        curr.reserve(2*n);
        unguarded_generate(result, curr, n, n);
        return result;
    }
};

回溯
这题的tag上有Backtracking,所以就想用回溯解。
思路是,先放'('后放')',满了之后回溯前一个可以修改的'(',回溯到最左边时结束。
m表示未安放的'('的数量,n表示未安放的')'的数量,正常的安放过程中,m一定小于等于n。回溯的循环条件中有一个m>n-2,因为后面有++m,–n的操作,所以要保证m+1<=n-1,即m<=n-2,如果条件不满足则要继续循环。
与递归相比,少了递归的开销,效率较高。

class Solution
{
public:
    vector<string> generateParenthesis(int k)
    {
        vector<string> result;
        string curr;
        curr.reserve(2*k);
        int m=k,n=k;
        while(1)
        {
            while(m>0)
            {
                curr.push_back('(');
                --m;
            }
            while(n>0)
            {
                curr.push_back(')');
                --n;
            }
            result.push_back(curr);
            while(*curr.rbegin()==')' || m>n-2)
            {
                if(*curr.rbegin()=='(') ++m;
                else ++n;
                curr.pop_back();
                if(curr.size()==0) return result;
            }
            *curr.rbegin()=')';
            ++m;
            --n;
        }
    }
};

你可能感兴趣的:(过时或冗余或暂时搁置)