Anagram - wykrywanie i grupowanie

1. Czym jest anagram?

Anagram to słowo lub fraza utworzona przez przestawienie liter innego słowa lub frazy, używając wszystkich oryginalnych liter dokładnie raz.

Przykłady:

✅ Anagramy słów:
- "listen" ↔ "silent"
- "evil" ↔ "vile" ↔ "live"
- "heart" ↔ "earth"
- "stressed" ↔ "desserts"

✅ Anagramy fraz (ignorując spacje):
- "astronomer" ↔ "moon starer"
- "the eyes" ↔ "they see"

❌ NIE anagramy:
- "hello" i "world" (różne litery)
- "abc" i "abcd" (różna długość)

2. Wykrywanie anagramów - sortowanie

2.1. Najprostsze podejście:

Złożoność: - Czasowa: O(n log n) – sortowanie - Pamięciowa: O(n) – nowe listy


3. Wykrywanie anagramów - liczenie znaków

3.1. Używając słownika:

Złożoność: - Czasowa: O(n) ✅ - Pamięciowa: O(k) – k = liczba unikalnych znaków

3.2. Używając Counter:

Najkrótsza i najczytelniejsza wersja!


4. Wykrywanie anagramów - tablica znaków

4.1. Dla alfabetu ASCII:

Zalety: - O(n) czas - O(1) pamięć (zawsze 26 elementów) ✅


5. Anagramy ignorując wielkość liter i spacje


6. Grupowanie anagramów

6.1. Problem:

Dany lista słów, zgrupuj anagramy razem.

6.2. Rozwiązanie – sortowanie jako klucz:

6.3. Rozwiązanie – liczenie jako klucz:

Złożoność: O(n × k) – lepsza niż sortowanie! ✅


7. Znajdowanie wszystkich anagramów w tekście

7.1. Problem:

Znajdź wszystkie indeksy startowe anagramów pattern w text.

7.2. Rozwiązanie – sliding window:

Złożoność: O(n) – każdy znak przetwarzany raz! ✅


8. Najdłuższy anagram w słowniku


9. Sprawdzanie, czy string zawiera anagram podstringa


10. Minimalne okno zawierające anagram

Złożoność: O(n + m)


11. Permutacje anagramów

Złożoność: O(n! × n) – eksponencjalna!


12. Porównanie metod wykrywania anagramów


13. Anagramy w praktyce

13.1. Gry słowne:

13.2. Sprawdzanie nazw użytkownika:


14. Podsumowanie

Anagram:

  • Słowo/fraza utworzona przez przestawienie liter
  • Przykłady: "listen" ↔ "silent", "evil" ↔ "vile"

Metody wykrywania:

Metoda Czas Pamięć Zalety
Sortowanie O(n log n) O(n) Najprostsza
Counter O(n) ✅ O(k) Czytelna, pythoniczne
Tablica (a-z) O(n) ✅ O(1) ✅ Najszybsza (tylko małe litery)
Słownik O(n) O(k) Uniwersalna

Implementacje podstawowe:

Grupowanie anagramów:

Sliding window dla anagramów w tekście:

Kluczowe obserwacje:

  • Anagramy mają tę samą długość – sprawdź to najpierw!
  • Sortowanie jako klucz – prosty sposób na grupowanie
  • Counter w Pythonie – najbardziej czytelne rozwiązanie
  • Sliding window – O(n) dla znajdowania w tekście

Zastosowania:

  • Gry słowne (Scrabble, krzyżówki)
  • Wykrywanie podobnych nazw (phishing)
  • Bezpieczeństwo (hasła podobne do loginów)
  • Bioinformatyka (podobne sekwencje)
  • Wyszukiwarki (sugestie słów)

Co dalej warto poznać:

  • Wyszukiwanie wzorców – Rabin-Karp, KMP
  • Permutacje i kombinacje – generowanie anagramów
  • Hash functions – szybkie porównywanie
  • Trie structures – grupowanie słów
  • Edit distance – podobieństwo stringów (Levenshtein)