← Назад к вопросам

Анаграммы

1.2 Junior🔥 101 комментариев
#Основы Go

Условие

Даны две строки s и t. Верните true, если t является анаграммой s.

Анаграмма - слово, составленное из тех же букв, что и исходное слово.

Сигнатура

func isAnagram(s, t string) bool

Примеры

Вход: s = "anagram", t = "nagaram" Выход: true

Вход: s = "rat", t = "car" Выход: false

Ограничения

  • Строки состоят только из строчных английских букв

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Анаграммы - решение

Описание

Анаграмма - слово из тех же букв, что исходное, но в другом порядке.

Решение 1: Массив (оптимальное)

func isAnagram(s, t string) bool {
    if len(s) != len(t) {
        return false
    }
    
    freq := [26]int{}
    
    for i := 0; i < len(s); i++ {
        freq[s[i]-'a']++
        freq[t[i]-'a']--
    }
    
    for _, count := range freq {
        if count != 0 {
            return false
        }
    }
    
    return true
}

Сложность:

  • Time: O(n)
  • Space: O(1) - массив всегда размера 26

Решение 2: HashMap

func isAnagramMap(s, t string) bool {
    if len(s) != len(t) {
        return false
    }
    
    freq := make(map[rune]int)
    for _, ch := range s {
        freq[ch]++
    }
    
    for _, ch := range t {
        if freq[ch] == 0 {
            return false
        }
        freq[ch]--
    }
    
    return true
}

Сложность: O(n) time, O(n) space

Решение 3: Сортировка

import "sort"

func isAnagramSort(s, t string) bool {
    if len(s) != len(t) {
        return false
    }
    
    rs := []rune(s)
    rt := []rune(t)
    sort.Slice(rs, func(i, j int) bool { return rs[i] < rs[j] })
    sort.Slice(rt, func(i, j int) bool { return rt[i] < rt[j] })
    
    return string(rs) == string(rt)
}

Сложность: O(n log n) time, O(1) space

Тестирование

func TestAnagram(t *testing.T) {
    tests := []struct{
        s, t string
        want bool
    }{
        {"anagram", "nagaram", true},
        {"rat", "car", false},
        {"ab", "ba", true},
        {"a", "a", true},
        {"a", "b", false},
    }
    
    for _, tt := range tests {
        if got := isAnagram(tt.s, tt.t); got != tt.want {
            t.Errorf("isAnagram(%q, %q) = %v, want %v", 
                tt.s, tt.t, got, tt.want)
        }
    }
}

Best Practices

  1. Всегда проверяй длину - O(1) экономия
  2. Используй массив для фиксированного алфавита
  3. Ранний выход на неверных символах
  4. Тестируй пустые строки и одиночные буквы