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

来源:互联网 发布:大数据与精准医学 编辑:程序博客网 时间:2024/04/28 01:46

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) // 此时可以放), 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;        }    }};
0 0
原创粉丝点击