题目要求:
给定括号对数 返回所有符合要求的括号组合
eg:
输入:1
输出:()
输入:2
输出:(()) () ()
思路:
原本打算用递归的思想
每一个括号都加在上一个括号中每一个独立存在的()中间和后面
但是实际编程的过程中发现 会出现重复的解
在最后去重虽然可以得出正确答案 但效率低下
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
ans = []
if n ==0 :
return []
if n ==1:
return ["()"]
if n == 2:
return ["(())","()()"]
res = self.generateParenthesis(n-1)
for i in range(len(res)):
for j in range(len(res[i])):
if res[i][j] == '(' and res[i][j+1] == ')':
list_temp = list(res[i])
list_temp.insert(j+1,'()')
strr = ''.join(list_temp)
if strr not in ans:
ans.append(strr)
list_temp = list(res[i])
list_temp.insert(j+2,'()')
strr = ''.join(list_temp)
if strr not in ans:
ans.append(strr)
return ans
解法也是动态规划,只是对于下一步的处理不合理)
每一个括号可看作上一组括号再添加一个括号
那么这个括号可以添加在上一组所有解的部分外部和部分前部
即:
输入为n
输出为(n=p时的所有解)n=q时的所有解
此处p+q=n-1
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n == 0:
return []
total_l = []
total_l.append([None]) # 0组括号时记为None
total_l.append(["()"]) # 1组括号只有一种情况
for i in range(2,n+1): # 开始计算i组括号时的括号组合
l = []
for j in range(i): # 开始遍历 p q ,其中p+q=i-1 , j 作为索引
now_list1 = total_l[j] # p = j 时的括号组合情况
now_list2 = total_l[i-1-j] # q = (i-1) - j 时的括号组合情况
for k1 in now_list1:
for k2 in now_list2:
if k1 == None:
k1 = ""
if k2 == None:
k2 = ""
el = "(" + k1 + ")" + k2
l.append(el) # 把所有可能的情况添加到 l 中
total_l.append(l) # l这个list就是i组括号的所有情况,添加到total_l中,继续求解i=i+1的情况
return total_l[n]