Как вернуть одинаковые буквы элементов с O (N) время сложности в JavaScript?

1

Я пытаюсь решить проблему с более низкой временной сложностью, которая в этом случае 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)?

Спасибо вам заранее!

  • 2
    Так что определите вашу проблему немного больше. Идея состоит в том, чтобы взять массив, для каждого элемента искать в остальной части массива слово, содержащее все те же буквы. Затем удалить оба и добавить пару к результату? Я не думаю, что ты когда-нибудь сделаешь это o(n)
  • 0
    Всегда ли в словах совпадают первая и последняя буквы?
Теги:
algorithm
time-complexity

1 ответ

4
Лучший ответ

У вас может быть представление "сумка букв" любой строки, отсортировав буквы:

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), что имеет место, если длина слов ограничена константой.

Отказ от ответственности: обратите внимание, что здесь мы говорим только об асимптотической сложности - это вовсе не означает, что этот подход является наиболее эффективным с практической точки зрения!

  • 0
    Технически, вам нужно было бы затем удалить элементы, которые не являются частью пары, чтобы получить результат, который хотел ОП. Ваш вывод все равно будет содержать something то. И итерация для удаления этих элементов будет O(n) .
  • 0
    Кроме того, неясно, что ожидает OP, если входные данные включают, например, come , emoc и moce . Это должна быть только одна пара? Или все три? Или что-то другое?
Показать ещё 14 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню