// 使用魔法:closure var backtrack func(int, map[rune]bool) backtrack = func(index int, set map[rune]bool) { // 递归终止条件 if index == len(arr) { ans = max(ans, len(set)) return }
str := arr[index] var repeat bool// 记录当前字符串是否和已有的相冲突 for _, v := range str { if _, ok := set[v]; ok { repeat = true } }
if !repeat { // map是“引用类型”,对它的操作会影响到上一级函数 newSet := make(map[rune]bool) for k, v := range set { newSet[k] = v } for _, v := range str { newSet[v] = true } // 向下走 backtrack(index+1, newSet) } // 向右走 backtrack(index+1, set) } backtrack(0, make(map[rune]bool)) return ans }
// 去除自身包含重复项的元素 funcremoveRepeat(arr []string) (ans []string) { for _, s := range arr { flag := true set := make(map[rune]bool) for _, ch := range s { if _, ok := set[ch]; ok { flag = false } else { set[ch] = true } } if flag { ans = append(ans, s) } } return }
funcmax(a, b int)int { if a > b { return a } return b }