[CareerCup 8.5] 输出括号

输出n对括号,正常打开,正常关闭的所有情况

[方法1] 采用递归的思路

/**
输出n对括号,正常打开,正常关闭的所有情况
采用递归的思路
首先采用递归求出n-1对括号,所有正常的组合
然后,对于n-1对括号的每一种情况(用*表示)都有3中情况:(*),()*,*()
注意:第二种情况和第三种情况,可能是一样的,也可能不一样
对于一样的情况只能算作一种
**/
vector parentheses(int n)
{
	vector s;
	if (n == 1)
		s.push_back("()");
	else
	{
		vector a = parentheses(n - 1);
		for (vector::iterator it = a.begin(); it != a.end(); it++)
		{
			s.push_back("(" + *it + ")");
			string x = "()" + *it;
			string y = *it + "()";
			if (x != y)
				s.push_back(x);
			s.push_back(y);
		}
	}
	return s;
}

 

[方法2] 非递归

/**
非递归的情况
首先从()开始,循环n-1次,每次向集合结果中添加一层括号
三种添加方法,与递归一样
每次扫描的时候发现当次扫描所代表的大小的所有值被删除的时候停止
**/
vector parentheses_loop(int n)
{
	vector v;
	v.push_back("()");
	for (int i = 1; i < n; i++)
	{
		while (v.begin()->size() == 2 * i)
		{
			v.push_back("(" + *v.begin() + ")");
			string x = "()" + *v.begin();
			string y = *v.begin() + "()";
			if (x != y)
				v.push_back(x);
			v.push_back(y);
			v.erase(v.begin());
		}
	}
	return v;
}

posted on 2011-12-22 22:41  小橋流水  阅读(159)  评论(0编辑  收藏  举报

导航