Skip to content

Latest commit

 

History

History
95 lines (65 loc) · 3.1 KB

File metadata and controls

95 lines (65 loc) · 3.1 KB

Programming-course-cpp

Jakub Piskorowski on 31/03/2022 wersja: 1.0

Temat: Sprawdzanie anagramów

Przedstawienie działania algorytmu sprawdzającego anagramy

Kod źródłowy: anagram.cpp

📒 Poziom 1

Powrót do Inne algorytmy


Objaśnienie

Anagram to wyraz lub zdanie powstałe po przestawieniu liter innego wyrazu (zdania). Oba wyrazy składają się z tej samej puli znaków, tylko w innym porządku.

Kilka przykładów:

  • adam
  • dama
  • fraktal
  • kartafl

Żeby sprawdzić, czy dwa słowa są anagramami policzymy wystąpienia każdej litery z pierwszego słowa, a następnie będziemy odejmować wystąpienia liter z drugiego słowa. Jeśli liczniki zostaną wyzerowane, oznaczać to będzie, że podane słowa są anagramami.

Jeśli będzie taka sytuacja, że ciągi znaków są różnej długości, to możemy od razu stwierdzić, że to nie są anagramy.

Przyład

Przeanalizujemy pierwszy przykład. Wystąpienia liter w słowie:

  • adam

a - 2
d - 1
m - 1

Kody ASCII powyższych liter to:
a - 97
d - 100
m - 109

a więc wartości komórek tablicy licz[97] = 2, licz[100] = 1, licz[109] = 1 (tablica licz[127] jest zadeklarowana i wyzerowana w poniższym programie, służy do zliczania liter).

Teraz robimy odwrotnie w stosunku do drugiego słowa. Każde wystąpienie litery dekrementujemy (zmniejszamy o 1). Jeśli w rezultacie wszystkie komórki tablicy będą równe zero, oznaczać to będzie, że wystąpienie każdej litery w jednym i drugim wyrazie jest takie samo.


Algorytm sprawdzania anagramu

Wejście:
wyraz1 - pierwszy wyraz do porównania
wyraz2 - drugi wyraz do porównania

Wyjście:
true / false - wyni algorytmu, czy wyrazy są anagramami czy nie

Zmienne pomocnicze:
dl1 - długość pierwszego wyrazu
dl2 - długość drugiego wyrazu
licz[] - liczni wystąpień danej litery

Lista kroków:
K1:   dl1 ← rozmiar(wyraz1)   wyznaczenie liczby liter w slowie1
K2:   dl2 ← rozmiar(wyraz2)   wyznaczenie liczby liter w slowie2
K3:   Jeśli dl1 != dl2   jesli dlugosci wyrazów nie sa równe, to nie moga byc anagramami
      to zwróć fałsz
K4:   licz[] ← {}   zerujemy licznik
K5:   Dla i = 0, 1, ..., dl1
      licz[wyraz1[]]++   zliczamy litery pierwszego wyrazu
K6:   Dla i = 0, 1, ..., dl1
      licz[wyraz2[]]--   odejmowanie wystąpień liter
K7:   Dla i = 0, 1, ..., 127
      wykonuj krok K8
K8:   Jeśli licz[] != 0   jeśli któryś licznik się nie wyzerował
      to zwróć fałsz
K9:   zwróć prawdę   jeśli wszystkie liczniki się wyzerowały, to jest to anagram
K10:   Zakończ

Wynik:

Podaj pierwszy wyraz: adam
Podaj drugi wyraz: dama
Podane wyrazy sa anagramami

Kod źródłowy: anagram.cpp