题目
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1 输出:["()"]
提示:
1 <= n <= 8
思路
可以列举出可能的组合,然后判断符号的合理性。
有效的括号 的题目判断合理性比这道题难,该题可以将左括号视为-1,有括号视为1。计算组合的和,一旦和sum==1, 则括号组合不合理,sum==0,则正好配对,sum==-1,则还差一个右括号。
对于找出可能的组合,电话号码的字母组合与这道题相似,利用递归。
Python代码
class Solution(object):
def generateParenthesis(self, n):
list=[]
s=['(']
sum=-1
def combine(sum,s):
if sum>0:
return
if len(s)==2*n and sum==0:
temp=''.join(s)
list.append(temp)
return
if len(s)==2*n:#此时sum!=0,不合理
return
for i in range(2):
if i==0:
s.append(')')
combine(sum+1,s)
s.pop()
else:
s.append('(')
combine(sum-1,s)
s.pop()
combine(sum,s)
return list
A=Solution()
n=2
print(A.generateParenthesis(n))
C语言
// 回溯法求解
#define MAX_SIZE 1430 // 卡特兰数: 1, 1, 2, 5, 14, 42, 132, 429, 1430
void generate(int left, int right, int n, char *str, int index, char **result, int *returnSize) {
if (index == 2 * n) { // 当前长度已达2n
result[(*returnSize)] = (char*)calloc((2 * n + 1), sizeof(char));
strcpy(result[(*returnSize)++], str);
return;
}
// 如果左括号数量不大于 n,可以放一个左括号
if (left < n) {
str[index] = '(';
generate(left + 1, right, n, str, index + 1, result, returnSize);
}
// 如果右括号数量小于左括号的数量,可以放一个右括号
if (right < left) {
str[index] = ')';
generate(left, right + 1, n, str, index + 1, result, returnSize);
}
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char** generateParenthesis(int n, int *returnSize) {
char *str = (char*)calloc((2 * n + 1), sizeof(char));
char **result = (char **)malloc(sizeof(char *) * MAX_SIZE);
*returnSize = 0;
generate(0, 0, n, str, 0, result, returnSize);
return result;
}
/*
作者:ciciywg
链接:https://leetcode.cn/problems/generate-parentheses/solutions/648432/jian-ji-cyu-yan-hui-su-fa-qiu-jie-by-cic-bdv5/
来源:力扣(LeetCode)
*/
总结
以上就是今天要讲的内容,继续练习。