Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:
输入: s = "a1b2"
输出: ["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:
输入: s = "3z4"
输出: ["3z4","3Z4"]
提示:
1 <= s.length <= 12s由小写英文字母、大写英文字母和数字组成
题解
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 :注意验证字符串单个字符是否符合规则,如果没有好的办法,建议通过正则。