题目:
给定一个字符串数组 arr,字符串 s 是将 arr 的含有 不同字母 的 子序列 字符串 连接 所得的字符串。
请返回所有可行解 s 中最长长度。
子序列 是一种可以从另一个数组派生而来的数组,通过删除某些元素或不删除元素而不改变其余元素的顺序。
算法:
方法一:回溯
思路知道,如何写出简洁的代码。
func maxLength(arr []string) int {
return backtrack(arr, 0, 0)
}
func backtrack(arr []string, index, bitFlag int) int {
if index == len(arr) {
return 0
}
bitFlagCopy := bitFlag
for i := range arr[index] {
bit := 1 << (arr[index][i] - 'a')
// 肯定用位运算标记字符是否重复出现是最好的,其他的方法map就别想了
if (bitFlag & bit) > 0 {
return backtrack(arr, index + 1, bitFlagCopy)
}
bitFlag = bitFlag | bit
}
return max(len(arr[index]) + backtrack(arr, index + 1, bitFlag), backtrack(arr, index + 1, bitFlagCopy))
}
func max(a, b int) int {
if a > b {
return a
}
return b
}