LeetCode 784. Letter Case Permutation
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:
输入:s = "a1b2" 输出:["a1b2", "a1B2", "A1b2", "A1B2"] 示例 2:
输入: s = "3z4" 输出: ["3z4","3Z4"]
提示:
1 <= s.length <= 12 s 由小写英文字母、大写英文字母和数字组成
算法
(DFS) O(n×2n)
深度优先搜索。从左到右一位一位枚举:
如果遇到数字,则直接跳过当前位,枚举下一位;
如果遇到字母,则分别将当前位设成小写字母和大写字母,然后递归到下一位;
小技巧:可以用位运算改变当前字母的大小写,从而简化代码:将一个字母异或32,即可改变这个字母的大小写。比如:
'a' ^ 32 = 'A';
'B' ^ 32 = 'b';
时间复杂度分析:最坏情况下,所有字符都是字母,则每个字符都有两种选择,一共会得到 2n 个字符串,最后将每个字符串记录在答案中还需要 O(n) 的计算量,所以总时间复杂度是 O(n×2n)。
C++ 代码
class Solution {
public:
vector<string> ans;
vector<string> letterCasePermutation(string S) {
dfs(S, 0);
return ans;
}
void dfs(string &S, int u){
if (u == S.size()){
ans.push_back(S);
return;
}
dfs(S, u + 1);
if (S[u] >= 'A'){
S[u] ^= 32;
dfs(S, u + 1);
}
}
};