leetcode- 串联字符串的最大长度

题目描述

题目

给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串,如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。

请返回所有可行解 s 中最长长度。

示例

输入:arr = [“un”,“iq”,“ue”]
输出:4
解释:所有可能的串联组合是 “”,“un”,“iq”,“ue”,“uniq” 和 “ique”,最大长度为 4。

输入:arr = [“cha”,“r”,“act”,“ers”]
输出:6
解释:可能的解答有 “chaers” 和 “acters”。

输入:arr = [“abcdefghijklmnopqrstuvwxyz”]
输出:26

提示

  • 1 <= arr.length <= 16
  • 1 <= arr[i].length <= 26
  • arr[i] 中只含有小写英文字母

解题方法(见注释)

回溯法搜索可行解模板

res = []
path = []

def backtrack(未探索区域, res, path):
    if path 满足条件:
        res.add(path) # 深度拷贝
        # return  # 如果不用继续搜索需要 return
    for 选择 in 未探索区域当前可能的选择:
        if 当前选择符合要求:
            path.add(当前选择)
            backtrack(新的未探索区域, res, path)
            path.pop()

本题解法及详细注释

class Solution:
    def maxLength(self, arr: List[str]) -> int:
        ## 首先将arr中所有含有重复字符的字符串踢除。此处不可直接用arr.remove(),这样相当于在遍历数组的同时操作数组,会出问题
        arr_new = []
        for i in arr:
            if len(i) <= len(set(i)):
                arr_new.append(i)

        ## 回溯法,采用递归方式进行回溯,维护一个strs,对于每个字符串有选和不选两种方式,剪枝:当前字符串与strs有重复字符,则直接剪掉“选”的情况
        res = []
        def backtrack(index,strs):
            ## 递归终止条件:index大于数组长度。
            if index >= len(arr_new):
                ## 将当前轮次递归结果加入结果集中。
                res.append(strs)
                return
            else:
                pre = arr_new[index]
                ## 如果strs与当前字符串有重复字符,则剪掉“选”结点
                if len(set(strs) & set(pre)) > 0:
                    ## 不选当前字符串直接进入下一字符串判定
                    backtrack(index+1,strs)
                ## 如果strs与当前字符串无重复字符,则有选与不选两种结点
                else:
                    ## 不选当前字符串直接进入下一字符串判定
                    backtrack(index+1,strs)
                    ## 选择当前字符串,进入下一字符串判定
                    strs+=arr_new[index]
                    backtrack(index+1,strs)
        backtrack(0,"")
        ## 找出可行解中的最长字符串长度,即为结果
        maxLength = 0
        for i in res:
            maxLength = max(len(i),maxLength)
        return maxLength

后记

  • 本题解法纯原创,转载请注明出处。
  • 如大佬对解法有改进意见,请评论区提出,感谢。
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值