Как найти частоту анаграммы в строке?

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

public static Map<String, Integer> generateAnagramFrequency(String str)
{ ... }

Например: если строка «найти искусство в крысе для корзины и отслеживания ДНК», ваш результат должен быть картой: найти -> 1 искусство -> 2 в -> 1 а -> 1 тележка -> 2 и -> 2

Ключи должны быть первым вхождением слова, а число — количеством анаграмм этого слова, включая само себя.

Решение, которое я придумал, состоит в том, чтобы отсортировать все слова и сравнить каждый символ из обеих строк до конца любой строки. Это будет O (logn). Я ищу какой-то другой эффективный метод, который не меняет две сравниваемые строки. Спасибо.


person false9striker    schedule 02.10.2011    source источник
comment
Это действительно очень похоже на домашнее задание. Вы можете начать с того, что расскажете нам о своем неудачном подходе/ах.   -  person Dr. belisarius    schedule 03.10.2011
comment
@belisarius Я обновил вопрос своим решением. Пожалуйста, удалите отрицательный голос, чтобы я мог задавать вопросы. теперь мне запрещено задавать вопросы :(   -  person false9striker    schedule 02.05.2014


Ответы (2)


Я написал реализацию JavaScript для создания n-граммы (анализ слов) по адресу Извлечь ключевые фразы из текста (ngrams из 1-4 слов).

Эту функцию можно легко изменить для анализа частотности анаграмм:
Замените s = text[i]; на s = text[i].sort(), чтобы порядок символов больше не имел значения.

person Rob W    schedule 02.10.2011

Создайте «подпись» для каждого слова, отсортировав его буквы в алфавитном порядке. Рассортируйте слова по подписям. Пробегитесь по отсортированному списку по порядку; если подпись совпадает с предыдущей подписью, у вас есть анаграмма.

person user448810    schedule 02.10.2011