LeetCode #784 Letter Case Permutation 字母大小写全排列

784 Letter Case Permutation 字母大小写全排列

Description:
Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string. Return a list of all possible strings we could create.

Example:

Input: S = "a1b2"
Output: ["a1b2", "a1B2", "A1b2", "A1B2"]

Input: S = "3z4"
Output: ["3z4", "3Z4"]

Input: S = "12345"
Output: ["12345"]

Note:

S will be a string with length between 1 and 12.
S will consist only of letters or digits.

题目描述:
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。

示例 :

输入: S = "a1b2"
输出: ["a1b2", "a1B2", "A1b2", "A1B2"]

输入: S = "3z4"
输出: ["3z4", "3Z4"]

输入: S = "12345"
输出: ["12345"]

注意:

S 的长度不超过12。
S 仅由数字和字母组成。

思路:

回溯法, 大小写转换可以使用 s[i] ^= (1 << 5), 实际上是大小写的 ascii码刚好相差 32
时间复杂度O(2 ^ n), 空间复杂度O(1), n表示字符串的长度

代码:
C++:

class Solution 
{
public:
    vector<string> letterCasePermutation(string S) 
    {
        vector<string> result;
        traceback(result, S, 0);
        return result;
    }
private:
    void traceback(vector<string> &result, string s, int len) 
    {
        if (len == s.size()) 
        {
            result.push_back(s);
            return;
        }
        traceback(result, s, len + 1);
        if (s[len] > '9') 
        {
            s[len] ^= (1 << 5);
            traceback(result, s, len + 1);
        }
    }
};

Java:

class Solution {
    public List<String> letterCasePermutation(String S) {
        List<String> result = new ArrayList<>();
        traceback(result, S.toCharArray(), 0);
        return result;
    }
    
    private void traceback(List<String> result, char[] s, int len) {
        if (len == s.length) {
            result.add(String.valueOf(s));
            return;
        }
        traceback(result, s, len + 1);
        if (s[len] > '9') {
            s[len] ^= (1 << 5);
            traceback(result, s, len + 1);
        }
    }
}

Python:

class Solution:
    def letterCasePermutation(self, S: str) -> List[str]:
        if not S:
            return [S]
        rest = self.letterCasePermutation(S[1:])
        if S[0].isalpha():
            return [S[0].lower() + s for s in rest] + [S[0].upper() + s for s in rest]
        return [S[0] + s for s in rest]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,403评论 0 2
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,808评论 0 10
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,464评论 0 5
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,905评论 0 38
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,446评论 0 9