leetcode

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

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

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
type stack struct {
data []string
top int
size int
}

func (s *stack) Push(str string) bool {
if s.top > s.size {
return false
} else {
s.data[s.top] = str
s.top++
return true
}
}

func (s *stack) Pop() (string, bool) {
if s.top == 0 {
return "", false
} else {
res := s.data[s.top]
s.top --
return res, true
}
}

func swap(arr []string, i int, j int) []string {
temp := arr[i]
arr[i] = arr[j]
arr[j] = temp
return arr
}

func qz(arr []string, flag int, res *[][]string) {
lenA := len(arr)
if flag == lenA {
*res = append(*res, arr)
} else {
for i := flag; i < lenA; i++ {
if arr[i] == arr[flag] && i != flag {
continue
}
arr = swap(arr, flag, i)
var temp = make([]string, lenA)
copy(temp, arr)
qz(temp, flag+1, res)
}
}
}

func generateParenthesis(n int) []string {
//size := 2 * n
var res []string
var quan []string
for i := 0; i < n; i++ {
quan = append(quan, "(")
}
for i := 0; i < n; i++ {
quan = append(quan, ")")
}
var quanz [][]string
quanzAddress := &quanz

qz(quan, 0, quanzAddress)
for _, k := range *quanzAddress {
i := 0
v := ""
newStack := stack{}
newStack.top = 0
newStack.size = 2 * n
newStack.data = make([]string, newStack.size)
for i, v = range k {
if string(v) == "(" {
newStack.Push(string(v))
} else {
_, err := newStack.Pop()
if err == false {
break
}
}
}

if i == 2*n-1 {
s := ""
for _, item := range k {
s += item
}
res = append(res, s)
}
}
return res
}