Рубрики
Без рубрики

Проблема с Leetcode: Групповые анаграммы

Фон Недавно я решил решить некоторые проблемы в leetcode.com для развлечения и развлечения… С тегами java, leetcode, программирование.

Фон

Недавно я решил решить некоторые проблемы в leetcode.com для развлечения и практики моей java, которой я давно не пользовался. Я решил задокументировать свой мыслительный процесс по мере решения этих проблем. Вы можете найти некоторые другие решения в таблице серий над этим разделом.

Проблема

Групповые анаграммы Учитывая список строк, верните список, в котором все анаграммы сгруппированы вместе.

Input: [ate, cat, tac, eat, mat, tea, tam, bat]
Output: [[ate, eat, tea] [cat, tac], [mat, tam], [bat]]

Примечание

Слово считается анаграммой другого, если оно может быть образовано путем перестановки всех букв первого слова.

Решение

Поиск анаграммы

Есть несколько способов определить, является ли одно слово анаграммой другого.

Отсортированная строка

Если у вас есть две строки назад и такси если вы отсортируете их, они оба приведут к одной и той же строке азбука . Следовательно, они являются анаграммами друг друга.

Количество символов

С теми же двумя строками бак и такси если вы можете подсчитать количество символов в каждом из подобных { a: 1, b: 1, c: 1 } и если они совпадают, то они являются анаграммами друг друга.

Группировка анаграмм

Моей первой мыслью было, что подсчет символов может быть непростым делом. Поэтому я выбрал подход с сортировкой строк.

Грубый алгоритм был:

  1. Инициализируйте пустую карту, которая будет хранить Отсортированную строку -> Список исходных строк
  2. Для каждой строки в списке,

    2.1 Сортировка строка

    2.2 Если в карте есть запись для строки, добавьте текущую строку в список.

    2.3 Создайте новый список с этим элементом и добавьте его на карту.

  3. Возвращает список всех значений на карте.

Это приводит к следующему коду:

Сложность

Сложность этого решения составляет O(n.m.logm) где n – количество строк в списке, а m – средняя длина строк в списке.

Примечание

Решив это, я просмотрел решения в leetcode и обнаружил, что вы можете использовать решение для подсчета символов, чтобы получить лучшее решение O (n.m) . Я попытаюсь сделать это в следующий раз.

Оригинал: “https://dev.to/deepakvenkat/leetcode-problem-group-anagrams-1nd5”