这个算法的时间/空间复杂度找到一个电话号码的字母组合?

时间:2017-07-12 01:39:21

标签: algorithm time-complexity space-complexity

我不确定它的时间/空间复杂度,因为虽然它有一个双循环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' ]

1 个答案:

答案 0 :(得分:0)

假设您不会在同一个i中使用phoneMap[i]两次,即最终通话为letterCombinations("0123....len(phoneMap)-1")

然后我认为它是formula,其中 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],那么上面的复杂性可以简化为formula2,其中 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>