字母大小写全排列

76 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:

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

示例 2:

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

提示:

1 <= s.length <= 12
s 由小写英文字母、大写英文字母和数字组成

二、思路分析

阅读完题目描述我们可以知道本题的题目要求是要我们将字符串里面任意字母转换大小写后可以得到的字符串集合,我们可以转换任意位置任意数目的字母。 面对这种题目我们可以用深度搜索的方法来解答,输入的字符串只包含数字和字母,因此我们可以分成两种情况来处理字符串,遇到数字时我们可以直接使用该数字来构造字符串,遇到字母时我们则需要将大写字母和小写字母两种情况都分别构造一个字符串。但构造字符串与原字符串长度一致时即说明已经构成完整的新字符串,可以终止递归,并将答案放进答案数组中去。

  • 深搜终止条件
if(i === s.length){
    res.push(str);
    return;
}
  • 遍历到数字字符
if(s[i] >= '0' && s[i] <= '9'){
    dfs(i + 1,str + s[i]);
}
  • 遍历到字母字符
else{
    dfs(i + 1,str + s[i].toLowerCase());
    dfs(i + 1,str + s[i].toUpperCase());
}

三、AC代码

/**
 * @param {string} s
 * @return {string[]}
 */
var letterCasePermutation = function(s) {
    let res = [];
    const dfs = function(i,str){
        if(i === s.length){
            res.push(str);
            return;
        }
        if(s[i] >= '0' && s[i] <= '9'){
            dfs(i + 1,str + s[i]);
        }
        else{
            dfs(i + 1,str + s[i].toLowerCase());
            dfs(i + 1,str + s[i].toUpperCase());
        }
    }
    dfs(0,'');
    return res;
};