力扣:括号生成问题

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[  "((()))",  "(()())",  "(())()",  "()(())",  "()()()"]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses


 

 大致思路

 以前接触过类似的题目,第一想法就是全排列里面进行删减选择,stl里面也正好有函数可以用。
 

class Solution {
    public:
	vector generateParenthesis(int n)
	{
        int x=n;
		vector res;
		int* arr = new int[x * 2];
		for (int i = 0; i < 2 * x; ++i)
		{
			if (i % 2 == 0)
				arr[i] = 1;
			else
				arr[i] = -1;
		}
		do
		{
			bool flag = true;
			int sum = 0;
			for (int i = 0; i < 2 * x && flag; ++i)
			{
				sum += arr[i];
				if (sum < 0)
					flag = false;
			}
			if (arr[0] == 1 && arr[2 * x - 1] == -1 && flag)
			{
				string str = "";
				for (int i = 0; i < x * 2; ++i)
				{
					if (arr[i] == 1)
						str += '(';
					else
						str += ')';
				}
				res.push_back(str);
			}
		} while (next_permutation(arr, arr + 2 * x));
                    //这里的函数不会改变数组本身的次序,以此实现全排列,所以生成的全排列次序和一开始的有关系
		return res;
	}
};

官方:https://leetcode-cn.com/problems/generate-parentheses/solution/gua-hao-sheng-cheng-by-leetcode/

看不懂+1,第二遍也没看懂。

来日方长 

评论里面有用动态规划的,还有二进制的
大致看了二进制的解法:

用0-1表示左右括号,聚合函数检测是否合法,二进制有个值域问题【101010,111000】

你可能感兴趣的:(LeetCode)