Две строки являются анаграммами, если совпадают количества каждого символа. Сначала проверяют длины, затем сравнивают частоты за линейное время.
Определение, является ли одна строка анаграммой другой
Две строки являются анаграммами, если совпадают количества каждого символа. Сначала проверяют длины, затем сравнивают частоты за линейное время.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Даны две строки src и dst. Нужно вернуть true, если dst — анаграмма src, и false в остальных случаях.
Пример 1: Ввод: src = "anagram", dst = "nagaram" Вывод: true
Пример 2: Ввод: src = "rat", dst = "car" Вывод: false
Ответ
Две строки являются анаграммами, если совпадают количества каждого символа. Сначала проверяют длины, затем сравнивают частоты за линейное время.
Для строк из байтов, например ASCII:
#include <array>
#include <cstddef>
#include <string>
bool isAnagram(const std::string& src, const std::string& dst) {
if (src.size() != dst.size()) return false;
std::array<std::size_t, 256> counts{};
for (unsigned char c : src) ++counts[c];
for (unsigned char c : dst) {
if (counts[c] == 0) return false;
--counts[c];
}
return true;
}
Здесь предполагается 8-битный байт. Регистр, пробелы и пунктуация учитываются. Для Unicode нужно сначала декодировать текст и договориться о нормализации и единице сравнения: байты UTF-8 не эквивалентны символам. Время O(n), память O(1) для фиксированного алфавита.