Wróć do: Algorytmy
podstawowy anagramtekstmatura podstawowa z informatyki

Sprawdzanie anagramu

Sprawdza czy dwa słowa są anagramami – zawierają te same litery w różnej kolejności.

01

Opis

Anagram to słowo lub zdanie powstałe z innego przez przestawienie liter. Oba wyrazy składają się z tej samej puli znaków i mają tę samą długość.

Przykłady: adamdama, fraktalkartafl, słomaomasł.

Algorytm zliczania liter: tworzymy tablicę 26 liczników (po jednym dla każdej litery alfabetu). Iterując po pierwszym słowie zwiększamy odpowiednie liczniki, a iterując po drugim – zmniejszamy. Jeśli na końcu wszystkie liczniki są zerami, słowa są anagramami. Indeks dla litery wyliczamy przez kod_ASCII(litera) - kod_ASCII('a').

Założenie: słowa zawierają tylko małe litery alfabetu angielskiego. Dla polskich liter trzeba rozszerzyć tablicę.

Pamięciowa O(1) – tablica liczników ma stały rozmiar 26, niezależny od długości słów.

Alternatywa: posortować oba słowa i porównać – O(n log n). Wersja zliczająca jest szybsza i lepsza na maturę.

02

Pseudokod

funkcja czy_anagram(a, b):
  jeżeli długość(a)  długość(b):
    zwróć fałsz
  // tablica liczników dla 26 liter alfabetu
  litery  tablica 26 zer
  // zliczamy litery: w 'a' dodajemy, w 'b' odejmujemy
  dla i od 0 do długość(a) - 1:
    litery[ascii(a[i]) - ascii('a')]  litery[ascii(a[i]) - ascii('a')] + 1
    litery[ascii(b[i]) - ascii('a')]  litery[ascii(b[i]) - ascii('a')] - 1
  // sprawdzamy czy wszystkie liczniki zerują się
  dla i od 0 do 25:
    jeżeli litery[i]  0:
      zwróć fałsz
  zwróć prawda
03

Implementacja w Pythonie

def czy_anagram(a, b):
    if len(a) != len(b):
        return False
    litery = [0] * 26
    for i in range(len(a)):
        litery[ord(a[i]) - ord('a')] += 1
        litery[ord(b[i]) - ord('a')] -= 1
    for liczba in litery:
        if liczba != 0:
            return False
    return True

# Przykład użycia
print(czy_anagram("adam", "dama"))
# Wynik: True
print(czy_anagram("kot", "pies"))
# Wynik: False
print(czy_anagram("listen", "silent"))
# Wynik: True

Złożoność obliczeniowa

CzasowaO(n)
PamięciowaO(1)

Powiązane zagadnienia

Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: