> For the complete documentation index, see [llms.txt](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/golang-zadachi/zadachi-na-mapy.md).

# Задачи на мапы

### 1) Написать метод, на вход которого приходит список слов, на выходе нужно вернуть список слов с подсписками, где каждый подсписок содержит слова - анаграммы (одинаковые слова с учетом перестановки символов).&#x20;

Давайте напишем метод на Go, который принимает список слов и возвращает список подсписков, где каждый подсписок содержит слова-анаграммы.

#### Пояснение решения

1. **Сортировка символов**:
   * Для каждого слова мы будем сортировать его символы. Это позволит нам легко сравнивать слова и определять, являются ли они анаграммами.
   * Например, для слова "listen" отсортированные символы будут "eilnst", и для слова "silent" отсортированные символы также будут "eilnst".
2. **Использование карты (map)**:
   * Мы будем использовать карту (map), где ключом будет отсортированное слово, а значением — список слов, которые являются анаграммами этого ключа.
   * Например, для ключа "eilnst" значением будет список \["listen", "silent"].
3. **Формирование результата**:
   * После того как мы заполним карту, мы преобразуем ее значения в список подсписков.

#### Код

```go
package main

import (
	"fmt"
	"sort"
	"strings"
)

// Функция для сортировки символов в строке
func sortString(s string) string {
	runes := []rune(s)
	sort.Slice(runes, func(i, j int) bool {
		return runes[i] < runes[j]
	})
	return string(runes)
}

// Функция для группировки анаграмм
func groupAnagrams(words []string) [][]string {
	anagramMap := make(map[string][]string)

	for _, word := range words {
		sortedWord := sortString(word)
		anagramMap[sortedWord] = append(anagramMap[sortedWord], word)
	}

	var result [][]string
	for _, anagrams := range anagramMap {
		result = append(result, anagrams)
	}

	return result
}

func main() {
	words := []string{"listen", "silent", "enlist", "inlets", "google", "gogole", "cat", "act", "tac"}
	anagramGroups := groupAnagrams(words)

	for _, group := range anagramGroups {
		fmt.Println(strings.Join(group, ", "))
	}
}
```

#### Объяснение кода

1. **Функция `sortString`**:
   * Принимает строку, преобразует ее в срез рун (`[]rune`), сортирует руны и возвращает отсортированную строку.
   * Это позволяет нам получить каноническую форму слова, которую можно использовать в качестве ключа в карте.
2. **Функция `groupAnagrams`**:
   * Принимает список слов и создает карту `anagramMap`, где ключом является отсортированное слово, а значением — список слов, которые являются анаграммами этого ключа.
   * Для каждого слова в списке:
     * Сортирует символы слова.
     * Добавляет слово в соответствующий список в карте.
   * После заполнения карты преобразует значения карты в список подсписков и возвращает его.
3. **Функция `main`**:
   * Пример использования функции `groupAnagrams`.
   * Выводит группы анаграмм на экран.

#### Заключение

Этот метод эффективно группирует слова-анаграммы, используя сортировку символов и карту для хранения и поиска групп анаграмм. Это решение масштабируется и работает быстро даже для больших списков слов.
