784. 字母大小写全排列
题目描述
给定一个字符串 s
,通过将字符串 s
中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:
输入:s = "a1b2" 输出:["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:
输入: s = "3z4" 输出: ["3z4","3Z4"]
提示:
1 <= s.length <= 12
s
由小写英文字母、大写英文字母和数字组成
解法
方法一:DFS
由于 \(s\) 中的每个字母都可以转换为大写或小写,因此可以使用 DFS 深度优先搜索的方法,枚举所有可能的情况。
具体地,从左到右遍历字符串 \(s\),对于遍历到的每个字母,可以选择将其转变为大写或小写,然后继续遍历后面的字母。当遍历到字符串的末尾时,得到一个转换方案,将该方案加入答案即可。
转变大小写的方法可以使用位运算实现。对于一个字母,小写形式与大写形式的 ASCII 码之差为 \(32\),因此,我们可以通过将该字母的 ASCII 码与 \(32\) 进行异或运算来实现大小写转换。
时间复杂度 \(O(n \times 2^n)\),其中 \(n\) 是字符串 \(s\) 的长度。对于每个字母,我们可以选择将其转换为大写或小写,因此一共有 \(2^n\) 种转换方案。对于每种转换方案,我们需要 \(O(n)\) 的时间生成一个新的字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
方法二:二进制枚举
对于一个字母,我们可以将其转换为大写或小写,因此对于每个字母,我们可以使用一个二进制位表示其转换的方案,其中 \(1\) 表示小写,而 \(0\) 表示大写。
我们先统计字符串 \(s\) 中字母的个数,记为 \(n\),那么一共有 \(2^n\) 种转换方案,我们可以使用二进制数的每一位表示每个字母的转换方案,从 \(0\) 到 \(2^n-1\) 进行枚举。
具体地,我们可以使用一个变量 \(i\) 表示当前枚举到的二进制数,其中 \(i\) 的第 \(j\) 位表示第 \(j\) 个字母的转换方案。即 \(i\) 的第 \(j\) 位为 \(1\) 表示第 \(j\) 个字母转换为小写,而 \(i\) 的第 \(j\) 位为 \(0\) 表示第 \(j\) 个字母转换为大写。
时间复杂度 \(O(n \times 2^n)\),其中 \(n\) 是字符串 \(s\) 的长度。对于每个字母,我们可以选择将其转换为大写或小写,因此一共有 \(2^n\) 种转换方案。对于每种转换方案,我们需要 \(O(n)\) 的时间生成一个新的字符串。
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 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
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 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|