Две строки являются анаграммами, если у каждого символа совпадает число вхождений. Подсчёт частот позволяет проверить это за O(n) без сортировки.
Определение, являются ли две строки анаграммами
Две строки являются анаграммами, если у каждого символа совпадает число вхождений. Подсчёт частот позволяет проверить это за O(n) без сортировки.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию, которая проверит, совпадают ли наборы символов в двух строках, независимо от их порядка (пример: "abc" и "cab"). using System;
public class Test
{
// abc
// acb
// bac
// bca
// cab
// cba
public static bool (AreAnagrams(string a, string b))
{
}
}
public static void Main(){
Console.WriteLine(AreAnagrams("abc", "cab"));
}
Ответ
Две строки являются анаграммами, если у каждого символа совпадает число вхождений. Подсчёт частот позволяет проверить это за O(n) без сортировки.
public static bool AreAnagrams(string a, string b)
{
if (a is null || b is null || a.Length != b.Length) return false;
var counts = new Dictionary<char, int>();
foreach (char c in a) {
counts.TryGetValue(c, out int n);
counts[c] = n + 1;
}
foreach (char c in b) {
if (!counts.TryGetValue(c, out int n) || n == 0) return false;
counts[c] = n - 1;
}
return true;
}
Для abc и cab результат true. Здесь учитываются регистр, пробелы и кодовые единицы UTF-16. Для пользовательского Unicode-текста отдельно согласуют нормализацию и сравнение Rune либо графем. В сигнатуре из условия нужно убрать лишние скобки вокруг имени метода.