[JavaScript / leetcode] 784. 字母大小写全排列

62 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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即可
  • 注意:当选定当前层的字符串之后,需要将其拼接到前面已经处理好的字符串的后面,再传递给下一层。那么同理:从当前层的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);
    }
  }
};