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

后记

  • 本题解法纯原创,转载请注明出处。
  • 如大佬对解法有改进意见,请评论区提出,感谢。

你可能感兴趣的:(小记,python,剪枝,回溯法,力扣,leetcode)