给定一个字符串数组 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] 中只含有小写英文字母
解题思路
一、枚举法
class Solution:
def maxLength(self, arr: List[str]) -> int:
# 使用枚举法,把所有的可能性都列举出来
# 使用set来判断是否有重复,因为集合汇总的元素具有互异性
unique_letter = [[]]
for word in arr:
# 如果单个字符串中有重复的,则不添加
if len(set(word))!=len(word):
continue
# unique_letter.append(set())
lens = len(unique_letter)
for i in range(lens):
# 判断需要添加的字符串是否有重复
# 当前需要添加的字符串可以添加到原有基础上所有的没有重复的中
if not set(''.join(unique_letter[i]))&set(word):
unique_letter.append(unique_letter[i]+[word])
# print(unique_letter)
return max([len(''.join(i)) for i in unique_letter])
解法二
回溯
class Solution():
def maxLength(self, arr):
t = []
# 筛选没有重复的字符串
for s in arr:
if len(set(s)) == len(s):
t.append(s)
print(t)
arr = t[:]
# print(arr)
# 递归标记当前运行到第i个字符;和当前的满足条件的最长字符tmp;
def dfs(i, tmp):
# 定义递归提出条件,如果到达最后一个字符串,则退出递归
if i >= len(arr):
return len(tmp)
else:
# 如果新添加的字符串在tmp中没出现过,那么可以选择添加,也可以选择不添加;如果出现过,则只能选择不添加
if not (set(tmp) & set(arr[i])):
return max(dfs(i+1,tmp+arr[i]),dfs(i+1,tmp))
else:
return dfs(i + 1, tmp)
num = dfs(0,'')
return num