给定一个字符串数组 arr
,字符串 s
是将 arr
某一子序列字符串连接所得的字符串,如果 s
中的每一个字符都只出现过一次,那么它就是一个可行解。
请返回所有可行解 s
中最长长度。
示例 1:
输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是 "","un","iq","ue","uniq" 和 "ique",最大长度为 4。
示例 2:
输入:arr = ["cha","r","act","ers"] 输出:6 解释:可能的解答有 "chaers" 和 "acters"。
示例 3:
输入:arr = ["abcdefghijklmnopqrstuvwxyz"] 输出:26
提示:
1 <= arr.length <= 16
1 <= arr[i].length <= 26
arr[i]
中只含有小写英文字母
思路:
数据规模暗示回溯,题目问组合明示回溯。
先把arr里所有含有重复字母的元素删掉,然后dfs+回溯找所有可能的组合。
class Solution(object):
def maxLength(self, arr):
"""
:type arr: List[str]
:rtype: int
"""
self.res = 0
visited = set()
t = []
for s in arr:
if len(set(s)) == len(s):
t.append(s)
arr = t[:]
def dfs(start, tmp):
self.res = max(self.res, len(tmp))
if start >= len(arr):
return
for i in range(start + 1, len(arr)):
if not (set(tmp) & set(arr[i])):
visited.add(arr[i])
dfs(i, tmp + arr[i])
visited.remove(arr[i])
for i, s in enumerate(arr):
visited.add(s)
dfs(i, s)
visited.remove(s)
return self.res