LeetCode Generate Parentheses (DFS)

题意

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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
输出N对括号的所有组合。

解法

比较明显的深搜,主要保存两个变量,一个left用来记录已经安放的左括号的数量,相当于一个栈,还有一个avaliable用来记录剩下还有多少个左括号可以取。当left不为空时,对于每一次新括号的选取,可以新增一个左括号(如果avaliable还没空的话),或者是取一个右括号来和之前的一个左括号匹配。当left为空时,能做的就只有一直取右括号来和前面的左括号匹配。

class Solution
{
public:
    vector<string> generateParenthesis(int n)
    {
	    vector<string>	ans;
	    string	temp;
	    dfs(0,n,0,n,ans,temp);
	    return	ans;
    }

    void	dfs(int left,int avaliable,int length,int n,vector<string> & ans,string temp)
    {
	    if(length == n * 2)
	    {
		    ans.push_back(temp);
		    return	;
	    }

	    if(left)
	    {
		    if(avaliable)
		    {
			    temp += '(';
			    dfs(left + 1,avaliable - 1,length + 1,n,ans,temp);
			    temp.pop_back();
		    }

		    temp += ')';
		    dfs(left - 1,avaliable,length + 1,n,ans,temp);
		    temp.pop_back();
	    }
	    else
		    if(avaliable)
		    {
			    temp += '(';
			    dfs(left + 1,avaliable - 1,length + 1,n,ans,temp);
			    temp.pop_back();
		    }
    }
};
posted @ 2016-09-10 17:48  Decouple  阅读(282)  评论(0编辑  收藏  举报