Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
字母大小写全排列
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:
输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:
输入: s = "3z4"
输出: ["3z4","3Z4"]
提示:
1 <= s.length <= 12s由小写英文字母、大写英文字母和数字组成
思路分析
- 分析题目,可知需要遍历字符串,在遇到数字的时候直接追加到结果上,遇到字母的时候需要追加一次大写,下一轮循环时再追加一次小写。
- 定义辅助函数
help,接受 开始索引 和 已选择的路径 为入参; - 按照分析的思路,对于
path来说,若是数字的话,则直接加入,不需要大小写转换,此处使用isNaN来判断是否为数字,同时可以不用判断是否到达字符串末尾。 - 结束条件是 已选择的路径的长度 等于 字符串的长度,然后将此路径放入结果集中;
- 未结束时,递归下一个,把当前字母的大小写都加入其中。
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。