给定一个字符串数组 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] 中只含有小写英文字母
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力。。。
class Solution: def maxLength(self, arr: List[str]) -> int: res=0 n=len(arr) arr.append('') for i in range(n): for j in range(n,len(arr)): arr.append(arr[i]+arr[j]) # print(arr) for i in range(n,len(arr)): mp=set() for j in arr[i]: if j not in mp: mp.add(j) else: mp=set() break # print(arr[i]) res=max(res,len(mp)) return res # 执行用时:1332 ms, 在所有 Python3 提交中击败了12.62%的用户 # 内存消耗:25.2 MB, 在所有 Python3 提交中击败了6.98%的用户
使用回溯法(因为答案来自数组中的字符串组合的某种结果,且需要遍历数组中所有元素的组合方式, 从这些组合中找到既满足字符唯一, 又是最长的结果即可)。
class Solution: def maxLength(self, arr: List[str]) -> int: res=0 def if_add(sub1,sub2): # 判断是否能合并sub1和sub2 for i in sub2: if i in sub1: return False return True def if_distinct(sub): # 判断自身是否为可行解 return len(set(sub))==len(sub) def backtrack(sub,cur,arr): # 回溯 nonlocal res if cur==len(arr): # print(sub,cur) res=max(res,len(sub)) return if if_distinct(arr[cur]) and if_add(sub,arr[cur]): # 剪枝 backtrack(sub+arr[cur],cur+1,arr) backtrack(sub,cur+1,arr) backtrack('',0,arr) return res # 执行用时:96 ms, 在所有 Python3 提交中击败了76.08%的用户 # 内存消耗:15 MB, 在所有 Python3 提交中击败了69.77%的用户
Python 对于变量的查找顺序为:局部的命名空间(Local) -> 全局命名空间(Global) -> 内置命名空间(Built-in)。
# var1 是全局名称 var1 = 5 def some_func(): # var2 是局部名称 var2 = 6 def some_inner_func(): # var3 是内嵌的局部名称 var3 = 7
当内部作用域想修改外部作用域的变量时,就要用到 global 和 nonlocal 关键字。
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字
【部分内容参考自】