main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. fmt.Println("hello" + "(")
  7. fmt.Println(generateParenthesis(3))
  8. }
  9. func generateParenthesis(n int) []string {
  10. result := []string{}
  11. left := 0
  12. right := 0
  13. strNow := ""
  14. var gobackfunc func(n int, left int, right int, strNow string)
  15. gobackfunc = func(n int, left int, right int, strNow string) {
  16. if right > left {
  17. return
  18. }
  19. if left == right && left == n {
  20. result = append(result, strNow)
  21. return
  22. }
  23. if left < n {
  24. gobackfunc(n, left+1, right, strNow+"(")
  25. }
  26. if left > right {
  27. gobackfunc(n, left, right+1, strNow+")")
  28. }
  29. }
  30. gobackfunc(n, left, right, strNow)
  31. return result
  32. }
  33. /*
  34. func generateParenthesis(n int) []string {
  35. //不能把result作为参数传过去,因为回溯后中,result是空的,也就是你append的都会被清掉
  36. result := []string{}
  37. left := 0
  38. right := 0
  39. strNow := ""
  40. var gobackfunc func(result []string, n int, left int, right int, strNow string)
  41. gobackfunc = func(result []string, n int, left int, right int, strNow string) {
  42. if right > left {
  43. return
  44. }
  45. if left == right && left == n {
  46. result = append(result, strNow)
  47. return
  48. }
  49. if left < n {
  50. gobackfunc(result, n, left+1, right, strNow+"(")
  51. }
  52. if left > right {
  53. gobackfunc(result, n, left, right+1, strNow+")")
  54. }
  55. }
  56. gobackfunc(result, n, left, right, strNow)
  57. return result
  58. }
  59. */
  60. /*
  61. func generateParenthesis(n int) []string {
  62. var generate func(left, right int, tmp []byte)
  63. res := make([]string, 0)
  64. generate = func(left, right int, tmp []byte) {
  65. if left == 0 && right == 0 {
  66. res = append(res, string(tmp))
  67. return
  68. }
  69. // 左括号还能放就优先放
  70. if left != 0 {
  71. tmp = append(tmp, '(')
  72. generate(left-1, right, tmp)
  73. tmp = tmp[:len(tmp)-1]
  74. }
  75. // 右括号数量不能大于左括号的,要不然合不回来,就不是合法数据了
  76. if right > left {
  77. tmp = append(tmp, ')')
  78. generate(left, right-1, tmp)
  79. tmp = tmp[:len(tmp)-1]
  80. }
  81. }
  82. generate(n, n, []byte{})
  83. return res
  84. }
  85. */