题目描述
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
示例: 输入:S = "a1b2" 输出:["a1b2", "a1B2", "A1b2", "A1B2"]
输入:S = "3z4" 输出:["3z4", "3Z4"]
输入:S = "12345" 输出:["12345"]
具体代码实现
var letterCasePermutation = function(s) {
let arr = [],
indexs = [],
temp = [...s]
temp.forEach((item, index) => {
if((item >= 'a' && item <= 'z') || (item >= 'A' && item <= 'Z')) {
indexs.push(index)
}
})
let len = indexs.length
arr.push(s)
if(len == 0)
return arr
let change = function (c) {
if(c >= 'a' && c <= 'z')
return c.toLocaleUpperCase()
return c.toLocaleLowerCase()
}
let dfs = function (start) {
if(start >= len)
return
for(let i = start; i < len; i++) {
temp[indexs[i]] = change(temp[indexs[i]])
arr.push(temp.join(''))
dfs(i+1)
temp[indexs[i]] = change(temp[indexs[i]])
}
}
dfs(0)
return arr
};
解题思路
-
对于给定字符串 str, 我们可以提取出一个索引数组indexs,使得 indexs \epsilon str , 以 str = 'a1b2'为例, 得到 indexs = [0, 2] (分别对应 str 中字母数据的下标),
-
然后分解出几个互不相交的子集 index1, index2 ... {\epsilon} {index} , 其中要满足各个子集不相等
-
将子集中对应 str下标的字母切换其大小写, 并存储到一个数组之中。
解题步骤 (以 str = ’a1b2‘为例子)
-
生成对应的索引数组 indexs = [0, 2] ( 这个步骤实际上是一个减枝, 我们没有必要每次都去重复遍历整个数据集)
-
拆分出只包含 i (i = 1)个元素的子集, [0], [2]
-
i自增
-
重复 2 -> 3 的步骤,直到 i == indexs.length
-
具体执行流程如下图
-
经过上述流程后我们可以得到 [0], [2], [0, 2]这三个子集, 此时再添加一个 ‘空集’ 即可。
题目来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。