classSolution{ privatevar t: Int = 0 fun maxLength(arr: List<String>): Int { return dfs(arr, 0, 0) }
private fun dfs(arr: List<String>, childIndex: Int, m: Int): Int { //用来存储当前结果小写字母出现的次数,只用了 26 位记录 if (childIndex == arr.size) { //dfs 到底了 return0 } t = m //t 用来存储 m 加上 str 中小写字母的次数 val str = arr[childIndex] if (isUnique(str)) { //如果结果加上 str 没有重复字符 val addChild = str.length + dfs(arr, childIndex + 1, t) //添加 str 的长度,继续深搜 val noAddChild = dfs(arr, childIndex + 1, m) //跳过 str 继续深搜 return max(addChild, noAddChild) //比较二者长度 } return dfs(arr, childIndex + 1, m) //结果加上 str 有重复,则结果为 跳过 str 继续深搜的长度 }
private fun isUnique(str: String): Boolean { val length = str.length for (i in 0 until length) { if (t and(1 shl str[i] - 'a') != 0) { //如果有重复字符,直接返回 returnfalse } t = t or(1 shl str[i] - 'a') } return true } }