题目
给定一个字符串 S,通过将字符串 S 中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
示例:
示例: 输入: S = "a1b2" 输出: ["a1b2", "a1B2", "A1b2", "A1B2"]
输入: S = "3z4" 输出: ["3z4", "3Z4"]
输入: S = "12345" 输出: ["12345"]
注意: S 的长度不超过12。 S 仅由数字和字母组成。
思路
这题不需要交换顺序排列组合,从0索引开始查找,如果是当前数组项为数字则跳过,为字母则将大写和小写两种组合添加到res中,并将index + 1传入作为下一次循环的索引的开始,直到匹配不到字母循环结束。
/**
* @param {string} S
* @return {string[]}
*/
const letterCasePermutation = S => {
const res = []
// 递归方法
const backtrack = (start, s) => {
res.push(s)
// start记录为字母项的下标,从start开始循环。
for (let i = start; i < s.length; i++) {
// 找到为字母的项,分别添加其大写与小写两种组合,数字则跳过。
if (s[i] >= 'a' && s[i] <= 'z') {
// 添加大写的组合进行拼接
backtrack(i + 1, s.slice(0, i) + s[i].toUpperCase() + s.slice(i + 1))
} else if (s[i] >= 'A' && s[i] <= 'Z') {
// 添加小写的组合进行拼接
backtrack(i + 1, s.slice(0, i) + s[i].toLowerCase() + s.slice(i + 1))
}
}
}
// 从0开始找,添加初始值进入res
backtrack(0, S)
return res
}