1239. 串联字符串的最大长度

给定一个字符串数组 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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值