1. 问题描述:
给定一个字符串数组 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]
中只含有小写英文字母
2. 思路分析:
① 仔细分析题目可以发现题目中存在一个很明显的特点是我们事先是不知道当前的字符串去拼接其他的字符串的是否哪一种情况是可能得到最长的字符串,所以我们需要逐个去尝试看一下选择当前的字符串与不选择当前的字符串得到的结果中选择较长的那个
② 在题解中看到一个写的比较好的代码,思路是首先需要遍历给出的列表,对于每一个当前的元素,通过python中的set集合来判断当前遍历的元素是否存在重复的字符,假如存在那么说明是不符合题目条件的,所以即使长度再长也是没有作用的,直接删除掉,这样我们就选择出每一个字符串中都是不含重复字符的列表,这道题目比较明显的是存在两个平行的状态,但是首先需要判断是否是即将拼接的字符串是否与之前拼接得到的字符串中存在重复字母,假如不存在那么存在两种选择,一种是选择当前的字符串进行拼接得到更长的,另外一种是不选择当前的字符串,因为我们有可能选择当前的字符串之后由于字符的重复之后我们就选择不了之后更长的字符串了,所以应该两种平行状态去尝试,取其中递归结果最大的那个
③ 当判断之前的到的拼接字符串与当前遍历列表的字符串存在重复的字符串了那么只能够不选择当前的字符串了,往下进行递归即可,大佬的题解如下:https://leetcode-cn.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters/
整体的思路还是非常清晰的,由于之前是没有考虑到使用set集合来判断,所以自己写起来的代码会很冗余
3. 代码如下:
class Solution():
def maxLength(self, arr):
t = []
for s in arr:
if len(set(s)) == len(s):
t.append(s)
arr = t[:]
def dfs(i, t):
if i >= len(arr):
return len(t)
else:
if not (set(t) & set(arr[i])):
return max(dfs(i + 1, t + arr[i]), dfs(i + 1, t))
else:
return dfs(i + 1, t)
res = dfs(0, '')
return res