LeetCode 784. Letter Case Permutation

98 阅读1分钟

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);
        }
    }
};