Нормализуйте регистр и пробелы, отсортируйте символы слова и используйте результат как ключ группы. В самих группах сохраняйте исходные строки, включая повторы.
Группировка слов списка по анаграммам
Нормализуйте регистр и пробелы, отсортируйте символы слова и используйте результат как ключ группы. В самих группах сохраняйте исходные строки, включая повторы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан набор строк. Необходимо объединить их в группы, где каждая группа состоит из слов‑анаграмм — слов, содержащих одинаковый набор букв, но расположенных в разном порядке. При формировании групп регистр символов и пробелы не учитываются.
public static void main(String[] args) {
List<String> anagrams = List.of("Race", "NIght", " Angel", "Care", "angel", "ThiNG", "angel", "angel") ;
System.out.println(removeAnagrams(anagrams));
}
Ответ
Нормализуйте регистр и пробелы, отсортируйте символы слова и используйте результат как ключ группы. В самих группах сохраняйте исходные строки, включая повторы.
static List<List<String>> removeAnagrams(List<String> words) {
Map<String, List<String>> groups = new LinkedHashMap<>();
for (String word : words) {
String normalized = word.toLowerCase(java.util.Locale.ROOT);
int[] points = normalized.codePoints()
.filter(c -> !Character.isWhitespace(c) && !Character.isSpaceChar(c))
.sorted().toArray();
String key = new String(points, 0, points.length);
groups.computeIfAbsent(key, k -> new ArrayList<>()).add(word);
}
return new ArrayList<>(groups.values());
}
Импорты коллекций из java.util. Получатся группы Race/Care, NIght/ThiNG и все варианты Angel/angel. Несмотря на название removeAnagrams, условие требует группировки, не удаления. Время — сумма O(m log m) по длинам слов.