转载请注明作者和出处:https://blog.csdn.net/qq_28810395
运行平台: Windows 10
LeetCode官网:Fhttps://leetcode-cn.com/
一、串联字符串的最大长度
给定一个字符串数组 arr
,字符串 s
是将 arr
某一子序列字符串连接所得的字符串,如果 s
中的每一个字符都只出现过一次,那么它就是一个可行解。请返回所有可行解 s
中最长长度。
1.示例 1:
输入:arr = ["un","iq","ue"]
输出:4
解释:所有可能的串联组合是 "","un","iq","ue","uniq" 和 "ique",最大长度为 4。
2.示例 2:
输入:arr = ["cha","r","act","ers"]
输出:6
解释:可能的解答有 "chaers" 和 "acters"。
3.示例 3:
输入:arr = ["abcdefghijklmnopqrstuvwxyz"]
输出:26
4.提示:
- 1 <= arr.length <= 16
- 1 <= arr[i].length <= 26
- arr[i] 中只含有小写英文字母
二、解答思路
- 选出arr中没有重复字符的字符串作为有效arr;
- 假设理想情况,将arr中所有有效且不重复的字符拼接在一起,其长度作为最大长度,达到此长度立即停止;
- 排除无效的情况,即arr中所剩所有字符串不重复的字符拼接在一起与现有ans的长度和超过不了之前的最大值,则停止;
- 回溯递归,递归结束的长度最大值即为所求。
三、解答
class Solution:
def maxLength(self, arr: List[str]) -> int:
valid_arr = [s for s in arr if len(set(s)) == len(s)]
max_len = len(set().union(*valid_arr))
self.max_n = 0
def maxLength(ans, arr):
if len(ans) == max_len\
or len(ans) + len(set().union(*arr)) <= self.max_n:
return
for i in range(len(arr)):
if not set(ans) & set(arr[i]):
ans += arr[i]
if len(ans) > self.max_n:
self.max_n = len(ans)
maxLength(ans, arr[i + 1:])
ans = ans.replace(arr[i], '')
maxLength('', valid_arr)
return self.max_n
四、参考信息
[1]https://leetcode-cn.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters/solution/zhi-xing-yong-shi-36-ms-zai-suo-you-pyth-2lx4/