Algorithm 该算法的时间/空间复杂度,以查找电话号码的字母组合?
我不确定它的时间/空间复杂性,因为尽管它有一个双for循环O(n^2),在for循环O(n)中,所以O(n^3),它也有一个数字并生成字母排列,就像O(n个数字x个字母的排列)Algorithm 该算法的时间/空间复杂度,以查找电话号码的字母组合?,algorithm,time-complexity,space-complexity,Algorithm,Time Complexity,Space Complexity,我不确定它的时间/空间复杂性,因为尽管它有一个双for循环O(n^2),在for循环O(n)中,所以O(n^3),它也有一个数字并生成字母排列,就像O(n个数字x个字母的排列) /** *@param{string}位 *@return{string[]} */ var permutate=函数(电流组合,下一个){ var结果=[]; 对于(var i=0;i
/**
*@param{string}位
*@return{string[]}
*/
var permutate=函数(电流组合,下一个){
var结果=[];
对于(var i=0;i”,结果);
返回结果;
}
var字母组合=函数(数字){
如果(数字==“”)返回[];
var phoneMap=[“0”、“1”、“abc”、“def”、“ghi”、“jkl”、“mno”、“pqrs”、“tuv”、“wxyz”];
var结果=[“”];
对于(变量i=0;i['ad','ae','af','bd','be','bf','cd','ce','cf']
假设您不会对同一个i使用phoneMap[i]
两次,即最终调用是字母组合(“0123…len(phoneMap)-1”)
那么我认为a[x]是phoneMap[x]的长度
考虑调用字母组合(“012”)
,并让phoneMap[1]、phoneMap[2]、phoneMap[3]的长度分别为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(电话地图[0])、len(电话地图[1])、len(电话地图[2])
如果可以接受较小的限制,我将假设您可以重用
phoneMap[I]
,那么上面的复杂性可以简化为:L是phoneMap
中最长的字符串,n是传递到字母组合中的数字长度
因为上面的公式将变成简单的几何和,比如说L=5
,你调用字母组合(“5555”)
,那么和就是5+5*5+5*5+5*5*5*5*5
=5*(5^(n)-1)/(5-1)
=O(5^n)
一个数字可以用两次吗?例如:字母组合(“111122223331123”)
/**
* @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' ]