Skip to content

Latest commit

 

History

History
48 lines (34 loc) · 2.55 KB

File metadata and controls

48 lines (34 loc) · 2.55 KB

Анаграм

  1. Yandex Contest

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

Примеры анаграмм:

  • night - thing;
  • cat - act;
  • save - vase;
  • stressed - desserts;
  • aa - a

Примеры: не являющиеся анаграммами:

  • save - sale (отличие в буквах v и l);
  • save - ave (отсутствие буквы s во втором слове);
  • saaa - ssaa (разное количество букв s и a в словах);

Решение:

№ алгоритма Время Память Модификация
1 O(n*log(n)) O(1) Да
2 O(n*log(n)) O(n) Нет
3 O(n) O(n) Нет

№1 - отсортировать сроки и потом их сравнить. Мы не тратим дополнительной памяти, но модифицируем входные данные. №2 - скопировать в новые структуры, отсортировать их и сравнить. Тогда мы не модифицируем, но нам понадобится дополнительная память. №3 - положить содержимое строк в ассоциативный массив/словарь и сравнить содержимое массивов для двух строк. Время выполнения алгоритма линейная, поскольку нам не требую тся дополнительные вычисления в виде сортировки.

func isAnagram(_ s: String, _ t: String) -> Bool {
    let cortageOfS = s.map { ($0, 1)}
    let cortageOfT = t.map { ($0, 1)}
    
    let setOfS = Dictionary(cortageOfS) { key, char in key + 1 }
    let setOfT = Dictionary(cortageOfT) { key, char in key + 1 }
    return setOfS == setOfT
}

Более лаконичное решение


2.1.3 Logical Expressions Theme | Back To iOSWiki Contents | 2.1.3.2 Count Chart In String Theme