leetcode 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:

"((()))", "(()())", "(())()", "()(())", "()()()"

思路:有n组括号,就有2n个符号,进行枚举,每次选择'('或者')',然后对无效的进行剪枝操作;

   以前判断一个字符串是否是合法的括号组合是用栈进行判断,碰到左括号进行入栈操作,碰到右括号进行出栈操作,如果碰到右括号的时候栈为空,则是非法的,如果最后栈为空则是合法的。

   

class Solution {
public:
	vectorres;
	string str;
	stackS;//辅助栈,用于判断组合是否合法
	void backtracking(int dep,int maxdep)
	{
		if (dep == maxdep)
		{
			if (S.empty())//栈空表明是合法的的字符串
			{
				res.push_back(str);
			}
			return;
		}
		str.push_back('('); //先添加左括号
		S.push('(');//栈也跟着添加左括号
		backtracking(dep + 1, maxdep); 
		str.pop_back();//回退
		S.pop();//回退
		str.push_back(')');//添加右括号
		if (!S.empty())//辅助栈不空,表明还有左括号
		{
			S.pop();//弹出一个左括号
			backtracking(dep + 1, maxdep);
			S.push('(');//回退左括号
			str.pop_back();//回溯
		}
		else{//剪枝操作,栈为空,则表明不匹配,不继续往下找,只是回退
			str.pop_back();
		}
	
	}
	vector generateParenthesis(int n) {
		backtracking(0, 2 * n);//2n的深度,总共有2n个符号
		return res;
	}
};

PS:代码还是有可以优化的地方的,碰到左括号或者右括号的数大于n就可以剪枝了,先这样吧,反正AC了。



你可能感兴趣的:(算法,回溯算法,leetcode)