持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
每日刷题 2022.10.30
- leetcode原题链接:
- 难度:中等
题目
- 给定一个字符串
s
,通过将字符串s
中的每个字母转变大小写,我们可以获得一个新的字符串。 - 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例
- 示例1
输入: s = "a1b2"
输出: ["a1b2", "a1B2", "A1b2", "A1B2"]
- 示例2
输入: s = "3z4"
输出: ["3z4","3Z4"]
提示
1 <= s.length <= 12
s
由小写英文字母、大写英文字母和数字组成
解题思路
- 根据题意:字符串中存在字符的位置,就会有
2
种可能性:大写字母/小写字母,总的来说:就是将所有可能的字符串序列展示出来,也就是找到当前字符串中所有字符的全排列(不是字符的位置可以直接跳过)。 - 既然要将所有的情况,全部都罗列出来,那么可以考虑使用
dfs
方法,整个递归的深度:字符串的长度n
,还需要一个中间变量str
,用来记录在dfs
的过程中,组成的字符串。- 当当前是大写或者小写字母的时候,就会有两种可能性,因为需要考虑两种可能性往下递归的情况,递归到下一层需要:1.当前的深度
idx + 1
,2.当前满足的字符串str
. - 当当前是数字的时候, 无需改变,直接递归下一层
idx + 1
即可
- 当当前是大写或者小写字母的时候,就会有两种可能性,因为需要考虑两种可能性往下递归的情况,递归到下一层需要:1.当前的深度
- 注意:当选定当前层的字符串之后,需要将其拼接到前面已经处理好的字符串的后面,再传递给下一层。那么同理:从当前层的
dfs
遍历完成,返回的时候,需要将其还原回去,再对当前层的字符串操作。避免上一次的操作影响到这一次的操作(回溯)。
补充
- 判断当前的字符是否是字符的时候,可以使用正则表达式,后面调用
test()
,查看当前的字符是否满足正则表达式的规则。
AC
代码
/**
* @param {string} s
* @return {string[]}
*/
var letterCasePermutation = function(s) {
let ans = [], n = s.length;
dfs(0, '');
return ans;
function dfs(idx, str) {
if(n === idx) {
// 记录下来结果
ans.push(str);
return;
}
// 判断当前的是否是字符
let ch = s[idx];
if(/[a-zA-Z]/.test(ch)) {
// 大小写字母
dfs(idx + 1, str + ch.toUpperCase());
dfs(idx + 1, str + ch.toLowerCase());
}else {
// 其他的数字,直接下一层
dfs(idx + 1, str + ch);
}
}
};