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 }
|
近期评论