我不确定它的时间/空间复杂度,因为虽然它有一个双循环O(n ^ 2),在for循环O(n)内,所以O(n ^ 3),它也有取一个数字并生成字母排列,所以有点像O(n个数字xm!字母的排列)。
/**
* @param {string} digits
* @return {string[]}
*/
var permutate = function(currentCombinations, nextLetters) {
var results = [];
for (var i = 0; i < currentCombinations.length; i++) {
for (var j = 0; j < nextLetters.length; j++) {
results.push(currentCombinations[i] + nextLetters[j]);
}
}
console.log(currentCombinations, '+', nextLetters, '=>', results);
return results;
}
var letterCombinations = function(digits) {
if (digits === "") return [];
var phoneMap = ["0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];
var result = [""];
for (var i = 0; i < digits.length; i++) {
var letterMappingsForDigit = phoneMap[digits[i]];
result = permutate(result, letterMappingsForDigit);
}
return result;
};
letterCombinations("23");
// => [ 'ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf' ]
答案 0 :(得分:0)
假设您不会在同一个i中使用phoneMap[i]
两次,即最终通话为letterCombinations("0123....len(phoneMap)-1")
,
然后我认为它是,其中 a [x] 是 phoneMap [x]
的长度考虑letterCombinations("012")
的调用,并分别设置phoneMap[1], phoneMap[2], phoneMap[3] be 3,5,2
的长度。
然后,您的算法会O(1)
推送1*3 + 1*3*5 + 1*3*5*2
次,这是
a[0] + a[0]a[1] + a[0]a[1]a[2]
其中a = [len(phoneMap[0]), len(phoneMap[1]), len(phoneMap[2])]
如果可以接受一个不太紧的边界,我会假设你可以重用phoneMap[i]
,那么上面的复杂性可以简化为,其中 L 是最长的字符串phoneMap
和 n 是您传入letterCombinations
的数字长度。
由于以上公式将变为简单的几何和,例如L = 5
并且您致电letterCombinations("5555")
,因此总和为5 + 5*5 + 5*5*5 + 5*5*5*5
= 5*(5^(n) - 1)/(5-1)
= O(5^n)
< / p>