题目:给定一个字符串S
,通过将字符串S
中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
看题目这是一个回溯算法题,但是本文并没有采用回溯算法,而是使用了空间换时间的思路。开辟一个矩阵,存储每一位可能的值。然后从前往后集合组装。
/**
* @param {string} S
* @return {string[]}
*/
var letterCasePermutation = function(S) {
var len = S.length;
if(len === 0) return [];
var collection = [];
for(let index =0; index<len;index++){
let l=S[index];
if(Number(l) >=0){
collection.push([l]);
}else{
collection.push([l.toLowerCase(), l.toUpperCase()]);
}
}
var result = collection[0];
for(let i = 1; i< len;i++){
var possibleL = collection[i];
var backup = result;
result = result.map(item => item + possibleL[0]);
for(let j=1;j < possibleL.length;j++){
result = result.concat(backup.map(item => item + possibleL[j]));
}
}
return result;
};
同理的还有 17. 电话号码的字母组合
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
var collection = [
["a","b","c"],
["d","e","f"],
["g","h","i"],
["j","k","l"],
["m","n","o"],
["p","q","r","s"],
["t","u","v"],
["w","x","y","z"]
]
var len = digits.length;
if(len===0) return [];
var result = collection[digits[0]-2];
for(let i = 1; i<len ; i++){
var possibleValues = collection[digits[i]-2];
var backup = result;
result = result.map(item=>item+possibleValues[0]);
for(let j=1;j<possibleValues.length;j++){
result=result.concat(backup.map(item=>item+possibleValues[j]));
}
}
return result;
};