У меня было задание исправить функцию, которая будет принимать 2 строки и возвращать количество символов, которые необходимо удалить, чтобы сделать 2 строки анаграммами друг друга. Мой вопрос в том, какова временная сложность этой функции и есть ли более быстрый способ добиться того же результата. Вот мое решение:
function anagramDelete(str1, str2){
let obj1 = {}, obj2 = {};
// Load obj1 with all characters of str1 and their count
str1.split('').forEach((char)=> {
if(char in obj1){
obj1[char]++;
} else {
obj1[char] = 1;
}
});
// Load obj2 with all characters of str1 and their count
str2.split('').forEach((char)=> {
if(char in obj2){
obj2[char]++;
} else {
obj2[char] = 1;
}
});
// Track # of chars deleted
let numOfDeletions = 0;
// Compare each char in obj1 w obj2 and count deletions
for(char in obj1){
if(obj2[char]){
numOfDeletions += Math.abs(obj2[char] - obj1[char]);
} else {
numOfDeletions += obj1[char];
}
}
// Compare each char in obj2 w obj1 and count deletions
for(char in obj2){
if(!obj1[char]){
numOfDeletions += obj2[char];
}
}
return numOfDeletions;
}
Насколько я могу судить, поскольку циклов 4, это будет O (4n) или просто O (n). Я говорю это, потому что нет вложенных циклов. Это правильно? Любые лучшие решения?
O(n)
. Потому что 4 цикла for не делают его в 4 раза медленнее. - person Jonas Wilms   schedule 04.01.2018