320. 列举单词的全部缩写 🔒
题目描述
单词的 广义缩写词 可以通过下述步骤构造:先取任意数量的 不重叠、不相邻 的子字符串,再用它们各自的长度进行替换。
- 例如,
"abcde"
可以缩写为:"a3e"
("bcd"
变为"3"
)"1bcd1"
("a"
和"e"
都变为"1"
)"5"
("abcde"
变为"5"
)"abcde"
(没有子字符串被代替)
- 然而,这些缩写是 无效的 :
"23"
("ab"
变为"2"
,"cde"
变为"3"
)是无效的,因为被选择的字符串是相邻的"22de"
("ab"
变为"2"
,"bc"
变为"2"
) 是无效的,因为被选择的字符串是重叠的
给你一个字符串 word
,返回 一个由 word
的所有可能 广义缩写词 组成的列表 。按 任意顺序 返回答案。
示例 1:
输入:word = "word" 输出:["4","3d","2r1","2rd","1o2","1o1d","1or1","1ord","w3","w2d","w1r1","w1rd","wo2","wo1d","wor1","word"]
示例 2:
输入:word = "a" 输出:["1","a"]
提示:
1 <= word.length <= 15
word
仅由小写英文字母组成
解法
方法一:DFS
我们设计一个函数 \(dfs(i)\),表示对于字符串 \(word[i:]\),返回其所有可能的缩写。
函数 \(dfs(i)\) 的执行逻辑如下:
如果 \(i \geq n\),说明已经处理完了字符串 \(word\),直接返回一个空字符串组成的列表。
否则,我们可以选择保留 \(word[i]\),然后对 \(dfs(i + 1)\) 返回的列表中的每个字符串前面添加 \(word[i]\),将得到的结果添加到答案中。
我们也可以选择删除 \(word[i]\) 及其后面的若干个字符,假设我们删除了 \(word[i..j)\),那么第 \(j\) 个字符不删除,然后对 \(dfs(j + 1)\) 返回的列表中的每个字符串前面添加 \(j - i\),将得到的结果添加到答案中。
最后,我们在主函数中调用 \(dfs(0)\) 即可。
时间复杂度 \(O(n \times 2^n)\),空间复杂度 \(O(n)\)。其中 \(n\) 是字符串 \(word\) 的长度。
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 |
|
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 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
方法二:二进制枚举
由于字符串 \(word\) 的长度不超过 \(15\),因此我们可以使用二进制枚举的方法枚举所有的缩写。我们用一个长度为 \(n\) 的二进制数 \(i\) 表示一种缩写方式,其中 \(0\) 表示保留对应的字符,而 \(1\) 表示删除对应的字符。我们在 \([0, 2^n)\) 的范围内枚举所有 \(i\),并将其转换成对应的缩写,添加到答案列表中即可。
时间复杂度 \(O(n \times 2^n)\),空间复杂度 \(O(n)\)。其中 \(n\) 是字符串 \(word\) 的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
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 |
|
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 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|