LC-784. 字母大小写全排列

93 阅读1分钟

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

题目描述

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

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

示例 1:

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

示例 2:

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

提示:

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

题解

1.闭坑

首先这道题有个坑的,我们每次遍历这个字符串的时候,获取每一个值,如何判断当前这个值是数字,例如

字符串的 '1',我们肯定不能直接 typeof 来判断,因为它是string,不是我们要的number 类型

所以在判断时,我想大概很多人会通过 isNaN 来进行判断。虽然说对于这道题可以通过这个方法,但是一旦延伸还是不稳健。

  • 例如 isNaN(' ') 结果为 false

  • isNaN 的原理,就是先进行一个 Number() 方法,再进行判断

所以这里,我选择正则来处理这个问题。验证单个字符是否是数字。

2.方法

这道题 用到了js的一个大小写转换的方法,toLowerCase()toUpperCase()

1.bfs

可以通过bfs 广度优先遍历的方式来解决

const letterCasePermutation = (s) => {
  let bfs = ['']
  const reg = /^[0-9]$/

  for (let item of s) {
    const newQueue = []

    while (bfs.length) {
      const val = bfs.shift()

      if (!reg.test(item)) {
        newQueue.push(val + item.toLowerCase())
        newQueue.push(val + item.toUpperCase())
      } else {
        newQueue.push(val + item)
      }
    }
    bfs = newQueue
  }

  return bfs
}

2.dfs

也可以通过dfs 深度优先遍历的方式来解决

const letterCasePermutation = (s) => {
  const res = []
  const sLength = s.length
  const reg = /^[0-9]$/
  const dfs = (start, str) => {
    if (str.length === sLength) return res.push(str)

    const val = s[start]

    if (!reg.test(val)) {
      dfs(start + 1, str + val.toLowerCase())
      dfs(start + 1, str + val.toUpperCase())
    } else {
      dfs(start + 1, str + val)
    }
  }
  dfs(0, '')
  return res
}

总结

题目 21 :注意验证字符串单个字符是否符合规则,如果没有好的办法,建议通过正则。