LeetCode 算法入门 — 字母大小写全排列

105 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

字母大小写全排列

原题地址

给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。

返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

示例 1:

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

示例 2:

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

提示:

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

思路分析

  1. 分析题目,可知需要遍历字符串,在遇到数字的时候直接追加到结果上,遇到字母的时候需要追加一次大写,下一轮循环时再追加一次小写。
  2. 定义辅助函数 help,接受 开始索引已选择的路径 为入参;
  3. 按照分析的思路,对于 path 来说,若是数字的话,则直接加入,不需要大小写转换,此处使用 isNaN 来判断是否为数字,同时可以不用判断是否到达字符串末尾。
  4. 结束条件是 已选择的路径的长度 等于 字符串的长度,然后将此路径放入结果集中;
  5. 未结束时,递归下一个,把当前字母的大小写都加入其中。

AC 代码

/**
 * @param {string} s
 * @return {string[]}
 */
var letterCasePermutation = function(s) {
    let result = []

    const help = (index, path) => {
        while (!isNaN(s[index])) {
            path += s[index++]
        }
        if (path.length === s.length) 
            return result.push(path)
        help(index + 1, path + s[index].toLowerCase())
        help(index + 1, path + s[index].toUpperCase())
    }
    
    help(0, "")
    return result
};

结果:

  • 执行结果: 通过
  • 执行用时:72 ms, 在所有 JavaScript 提交中击败了84.93%的用户
  • 内存消耗:45.1 MB, 在所有 JavaScript 提交中击败了22.75%的用户
  • 通过测试用例:63 / 63

总结

MDN 释义: isNaN() 函数用来确定一个值是否为NaN

var isNaN = function(value) {
    var n = Number(value);
    return n !== n;
};

由上述 polyfill 的代码,可以得知 isNaN 中需要先将入参转换成 Number。

附:Number类型转换规则

END