LeetCode #242 - Valid Anagram

preview_player
Показать описание

Дружное сообщество:

Материалы для разработчиков:

00:00:00 Описание задачи
00:01:25 Анализ и реализацией решения путем сортировки и сравнения строк
00:04:34 Анализ и реализацией решения путем подсчета количества символов
00:08:27 Анализ и реализацией решения путем подсчета количества символов (Unicode)
00:12:07 Анализ и реализацией решения путем подсчета количества символов (Unicode) - Streams
00:13:31 Вывод
Рекомендации по теме
Комментарии
Автор

Я сейчас сам учусь на лит коде, было бы славное если бы ты много видосов дела на эту тему, по одной задачки в день, очень интересно смотреть

ВладЛевчик-лп
Автор

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

edmond-dantes-
Автор

Третье решение для юникода может быть таким:

public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}

var map = s.chars()
.mapToObj(c -> (char) c)
-> c, Collectors.counting()));

t.chars()
.mapToObj(c -> (char) c)
.forEach(c -> map.compute(c, (k, v) -> v == null ? -1 : --v));

return -> count != 0L);
}

Беда лишь в том, что оба решения неверные. Дело в том, что юникодные символы находятся в пространстве 32-х битных значений, но в Java используется UTF-16, в котором char - это, на самом деле не символ, вернее не всегда символ, а так называемый code point. Чаще всего первых 16-и бит достаточно для представления символов обычных языков или Basic Multilingual Plane (BMP) и тогда в char находится именно символ. Но иногда символ может кодироваться двумя 16-и битными значениями и тогда каждое из этих значений в отдельности символом не является. Для проверки этого даже есть метод Character.isLetter()
Примеры символов, требующих два char значения: 𨭎 𠬠 𩷶
Если эти char значения в паре поменять местами, получится другой символ и такая якобы анаграмма на самом деле вовсе не анаграмма.
На leetcode этого не учли и поэтому наши решения проходят тестирование, хотя не должны.

prayer
Автор

Евгений, имеет ли смысл давать ссылку на профиль leetcode в резюме?

ilialenskii
Автор

Евгений, сами решали или с помощью gpt chat?

andreyyyymeee
Автор

Про первый вариант решения. Там ведь не просто O(n log n), а O(n log n) + O(n log n) + N\2. Где N\2 (среднее) это посимвольное сравнение, где в худшем случае будет сравнение до конца массивов, если строки равны. Как вы оцениваете такое решение на интервью от 1 до 10?

ilialenskii
Автор

я решал эту задачу я такой там код написал как дом из 5 этажей)) и показывать стыдно)

nickpetr
Автор

Если не секрет, расскажите почему решили продолжит решать задачки после столь длительного перерыва.

ilialenskii