1239. 串联字符串的最大长度
题目描述
给定一个字符串数组 arr
,字符串 s
是将 arr
的含有 不同字母 的 子序列 字符串 连接 所得的字符串。
请返回所有可行解 s
中最长长度。
子序列 是一种可以从另一个数组派生而来的数组,通过删除某些元素或不删除元素而不改变其余元素的顺序。
示例 1:
输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是: - "" - "un" - "iq" - "ue" - "uniq" ("un" + "iq") - "ique" ("iq" + "ue") 最大长度为 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]
中只含有小写英文字母
解法
方法一:状态压缩 + 位运算
由于题目要求子序列的字符不能重复,字符都是小写字母,因此,我们可以用一个长度为 \(26\) 的二进制整数来表示一个子序列,其中第 \(i\) 位为 \(1\) 表示子序列中含有滴 \(i\) 个字符,为 \(0\) 表示不含有第 \(i\) 个字符。
我们可以用一个数组 \(s\) 来存储所有满足条件的子序列的状态,初始时 \(s\) 中只有一个元素 \(0\)。
然后我们遍历数组 \(\textit{arr}\),对于每个字符串 \(t\),我们用一个整数 \(x\) 来表示 \(t\) 的状态,然后我们遍历数组 \(s\),对于每个状态 \(y\),如果 \(x\) 和 \(y\) 之间没有相同的字符,那么我们将 \(x\) 和 \(y\) 的并集加入到 \(s\) 中,并更新答案。
最后我们返回答案即可。
时间复杂度 \(O(2^n + L)\),空间复杂度 \(O(2^n)\),其中 \(n\) 是字符串数组的长度,而 \(L\) 是字符串数组中所有字符串的长度之和。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|