funcpartition(s string) [][]string { var n = len(s) var path = make([]string, 0) var ans [][]string var dfs func(int, int)
dfs = func(i int, start int){ if i == n{ for _, str := range path{ if !isPalindrome(str){ return } } ans = append(ans, append([]string{}, path...)) return }
// 当前逗号不选择,最后一个 i 就没逗号了 if i < n - 1{ dfs(i + 1, start) } // 当前逗号选择 path = append(path, s[start:i + 1]) dfs(i + 1, i + 1) // 恢复原样 path = path[:len(path) - 1] } dfs(0, 0) return ans }
// isPalindrome 是否是回文串 funcisPalindrome(s string)bool{ var left, right = 0, len(s) - 1 for left < right{ if s[left] == s[right]{ left++ right-- continue } returnfalse } returntrue }
LeetCode 77
思路
老方法感觉和之前的没啥不一样。
对于优化,即剪枝。设 d = n - len(path),d 代表的就是还要选多少个数。如果 d == 0,那么当前可以记录成答案。如果 i < d,那么其实可以不用递归下去了。
funcgenerateParenthesis(n int) []string { var m = 2 * n // 括号的个数 var path = make([]byte, m) var ans []string var dfs func(int, int) // left 作为当前左括号的个数传递下去 dfs = func(i, left int){ if i == m{ ans = append(ans, string(path)) return }
if left < n{ // 当前可以是左括号 path[i] = '(' dfs(i + 1, left + 1) }
if i - left < left{ path[i] = ')' dfs(i + 1, left) }
funcsolveNQueens(n int) [][]string { var modelByte = make([]byte, n) for i := range modelByte{ modelByte[i] = '.' }
var col = make([]bool, n) // 记录哪一列已经有皇后了 var have1 = make(map[int]bool) // 右斜线上是否有元素 var have2 = make(map[int]bool) // 左斜线上是否有元素
var path = make([]string, n) var ans [][]string var dfs func(int)
dfs = func(i int){ if i == n{ ans = append(ans, append([]string{}, path...)) return }
for j, isColHave := range col{ if !isColHave { // 当前列没有皇后 // 斜线上是否有元素 if isHave, ok := have1[i + j]; ok && isHave{ continue } if isHave, ok := have2[i - j]; ok && isHave{ continue }