Я пытаюсь решить проблему с более низкой временной сложностью, которая в этом случае O(n)
.
Вот проблема:
let arr = ['dog', 'come', 'ogd', 'something', 'emoc'];
Он должен вернуться
[['dog', 'ogd], ['come', 'emoc']]; // which same using letters
Пока я решил эту проблему, используя две функции, она отлично работает, но моя вложенная петля даст мне O(n2)
Вот мой код
const isSameChars = (str1, str2) => {
let str1sorted = str1.split("").sort().join("");
let str2sorted = str2.split("").sort().join("");
if (str1.length !== str2.length) {
return false;
}
for (var i = 0; i < str1sorted.length; i++) {
let char1 = str1sorted[i];
let char2 = str2sorted[i];
if (char1 !== char2) {
return false;
}
}
return true;
}
const isSameCharElements = (arr) => {
let result = [];
for(var i = 0; i < arr.length; i++) {
for(var j = 0; j < i; j++) {
if (isSameChars(arr[i], arr[j]) === true) {
result.push(arr[j])
}
}
}
return result;
}
console.log(isSameCharElements(['dog', 'come', 'ogd', 'something',
'emoc'])) // [['dog', 'ogd], ['come', 'emoc']]
Есть ли способ решить эту проблему с временной сложностью O(n)
?
Спасибо вам заранее!
У вас может быть представление "сумка букв" любой строки, отсортировав буквы:
function sortLetters(word){
return word.split('').sort().join('');
}
Затем вы можете перебирать свой вход, группируя слова, которые имеют один и тот же пакет букв в объекте:
const grouped = arr.reduce(function (m, word) {
var bagRepr = sortLetters(word);
var withSameLetters = m[bagRepr] || [];
withSameLetters.push(word);
m[bagRepr] = withSameLetters;
return m;
}, {});
const result = Object.values(grouped)
.filter(function (arr) {
return arr.length > 1;
});
Это O (n), при условии, что sortLetters()
является O (1), что имеет место, если длина слов ограничена константой.
Отказ от ответственности: обратите внимание, что здесь мы говорим только об асимптотической сложности - это вовсе не означает, что этот подход является наиболее эффективным с практической точки зрения!
something
то. И итерация для удаления этих элементов будет O(n)
.
come
, emoc
и moce
. Это должна быть только одна пара? Или все три? Или что-то другое?
o(n)