łatwyAlgorytmyPythonC++

Palindromy Tekstowe i Liczbowe na Maturze z Informatyki

10 min czytania
Python, C++
Zaktualizowano: 4.11.2025

Palindrom to słowo, fraza lub liczba, która czyta się tak samo od przodu, jak i od tyłu. Przykłady to 'kajak', 'radar', 'Kobyła ma mały bok' czy liczba 12321. To jeden z klasycznych problemów algorytmicznych, który świetnie testuje Twoją umiejętność manipulowania stringami lub liczbami. Logika jest prosta: musisz porównać pierwszy znak z ostatnim, drugi z przedostatnim i tak dalej, aż dojdziesz do środka. Jeśli wszystkie pary się zgadzają, masz palindrom. To bardzo wdzięczny temat, bo algorytm jest prosty do zapamiętania i zaimplementowania, a w Pythonie można to zrobić w jednej linijce.

Dlaczego to ważne? Na maturze zadania o palindromach pojawiają się regularnie. Są to często 'pewniaki' na punkty w zadaniach z przetwarzania tekstu (np. 'znajdź palindromy w pliku'). Sprawdzają Twoją znajomość pętli, stringów i indeksowania. Znajomość szybkiego sposobu na odwrócenie stringa w Pythonie (`[::-1]`) to ogromny atut i oszczędność czasu. Zadanie o palindromach pojawiło się m.in. na maturze w maju 2025.

Teoria

Główna idea polega na sprawdzeniu, czy sekwencja (tekst lub cyfry) jest identyczna ze swoją odwrotnością. Można to zrobić na dwa główne sposoby: 1) Tworząc nowy, odwrócony string i porównując go z oryginałem (podejście bardzo szybkie w Pythonie). 2) Używając dwóch 'wskaźników' (indeksów), jednego na początku i jednego na końcu, i zbliżając je do siebie, porównując przy tym znaki (podejście uniwersalne, wydajne pamięciowo).

Jak to działa?

  1. **Metoda 1: Porównanie z odwrotnością (prostsza):**
  2. Krok 1: Wczytaj dane (np. string 'kajak').
  3. Krok 2: Stwórz odwróconą wersję tego stringa (np. 'kajak' -> 'kajak').
  4. Krok 3: Porównaj oryginał z odwróconym: `if oryginal == odwrocony: return True`.
  5. **Metoda 2: Dwa wskaźniki (wydajniejsza pamięciowo):**
  6. Krok 1: Ustaw wskaźnik `lewy = 0` (pierwszy znak) i `prawy = len(napis) - 1` (ostatni znak).
  7. Krok 2: Rozpocznij pętlę `while lewy < prawy` (dopóki wskaźniki się nie miną).
  8. Krok 3: W pętli sprawdź: `if napis[lewy] != napis[prawy]: return False` (znaleziono różnicę, to nie palindrom).
  9. Krok 4: Jeśli znaki są równe, przesuń wskaźniki do środka: `lewy += 1`, `prawy -= 1`.
  10. Krok 5: Jeśli pętla się zakończy (wskaźniki się spotkają lub miną), to znaczy, że nie znaleziono różnic. Zwróć `True`.

Złożoność: Obie metody mają złożoność czasową **O(n)**, gdzie 'n' to długość stringa. Musimy przeanalizować każdy znak (albo by go skopiować/odwrócić, albo by go porównać). Metoda dwóch wskaźników ma złożoność pamięciową **O(1)** (stałą, bo używamy tylko kilku zmiennych), podczas gdy tworzenie pełnej kopii odwróconego stringa ma złożoność pamięciową **O(n)**.

Implementacja

Sposób 1: Slicing (cięcie) - najszybszy i polecany

Python
def czy_palindrom(s):
    return s == s[::-1]

print(czy_palindrom("kajak")) # True
print(czy_palindrom("kobyła ma mały bok")) # False (przez spacje)
print(czy_palindrom("python")) # False

To jest najbardziej 'pythonowy' i najszybszy do napisania sposób. `s[::-1]` to specjalna składnia cięcia (slicingu), która tworzy nowy string, będący kopią `s` odwróconą wspak (krok -1). Następnie po prostu porównujemy oryginał z kopią.

Sposób 2: Palindromy liczbowe (konwersja na string)

Python
def czy_palindrom_liczbowy(n):
    # Konwertujemy liczbę na string
    s = str(n)
    # I sprawdzamy jak zwykły string
    return s == s[::-1]

print(czy_palindrom_liczbowy(12321)) # True
print(czy_palindrom_liczbowy(12345)) # False

Nie próbuj odwracać liczby za pomocą skomplikowanej matematyki (pętli z `% 10` i `* 10`). Na maturze najprościej i najbezpieczniej jest zamienić liczbę na string (`str(n)`) i użyć standardowej metody sprawdzania palindromów tekstowych.

Sposób 1: Dwa wskaźniki (pętla)

C++
#include <iostream>
#include <string>

using namespace std;

bool czy_palindrom(string s) {
    int lewy = 0;
    int prawy = s.length() - 1;
    
    while (lewy < prawy) {
        if (s[lewy] != s[prawy]) {
            return false; // Znaleziono różnicę
        }
        lewy++;
        prawy--;
    }
    return true; // Pętla skończona, brak różnic
}

int main() {
    cout << czy_palindrom("kajak") << endl; // Wypisze 1 (true)
    cout << czy_palindrom("program") << endl; // Wypisze 0 (false)
    return 0;
}

To jest klasyczna, uniwersalna metoda. Używamy dwóch indeksów (`lewy`, `prawy`). Pętla `while` działa, dopóki się nie spotkają. W każdej iteracji porównujemy znaki. Jeśli są różne, natychmiast przerywamy i zwracamy `false`. Jeśli pętla dojdzie do końca, zwracamy `true`.

Sposób 2: Odwrócenie kopii (std::reverse)

C++
#include <iostream>
#include <string>
#include <algorithm> // Dla std::reverse

using namespace std;

bool czy_palindrom_kopia(string s) {
    string kopia = s;
    reverse(kopia.begin(), kopia.end());
    return s == kopia;
}

int main() {
    cout << czy_palindrom_kopia("radar") << endl; // 1 (true)
    return 0;
}

To jest odpowiednik pythonowego `s[::-1]`. Musisz dołączyć bibliotekę `<algorithm>`. Tworzysz kopię stringa, a następnie odwracasz ją 'w miejscu' za pomocą `reverse()`. Na koniec porównujesz oryginał z odwróconą kopią.

Przykładowe Zadania Maturalne

Matura 2026Zadanie Zadanie Typu Maturalnego 1

W pliku 'liczby.txt' znajduje się 200 liczb całkowitych, każda w nowej linii. Napisz program, który policzy, ile z tych liczb jest palindromami liczbowymi (np. 121, 55, 7887).

Wskazówka: To jest zadanie na palindromy liczbowe. Najprościej jest wczytać każdą liczbę, zamienić ją na string (`str(liczba)` w Pythonie lub `to_string(liczba)` w C++) i sprawdzić, czy ten string jest palindromem.

Pokaż szkic rozwiązania
1. Otwórz plik 'liczby.txt' do odczytu.
2. Zainicjuj `licznik_palindromow = 0`.
3. Zdefiniuj funkcję `czy_palindrom(s)` (np. `return s == s[::-1]` w Pythonie).
4. Dla każdej linii w pliku:
   a. Wczytaj `linia = linia.strip()`.
   b. *Uwaga: Nie musisz konwertować na int! Możesz sprawdzić stringa od razu.*
   c. Sprawdź: `if czy_palindrom(linia):`
   d. `  licznik_palindromow += 1`
5. Wypisz `licznik_palindromow`.
Matura 2025Zadanie 2.1 (Matura Maj 2025)

W pliku symbole.txt zapisano 2000 napisów. Każdy z nich jest zapisany w osobnym wierszu i składa się z dokładnie 12 znaków. Podaj wszystkie takie napisy z pliku symbole.txt, które są palindromami (czytane od przodu i od tyłu są takie same). Wypisz je po jednym w wierszu, w kolejności takiej jak w pliku symbole.txt.

Wskazówka: Wczytaj każdy napis z pliku pętlą. Dla każdego napisu 's' musisz sprawdzić, czy jest on identyczny ze swoją odwrotnością. W Pythonie możesz to zrobić jednym, prostym warunkiem: `if s == s[::-1]:`. W C++ użyj metody z dwoma wskaźnikami.

Pokaż szkic rozwiązania
1. Otwórz plik 'symbole.txt' do odczytu.
2. Otwórz plik 'wyniki2_1.txt' do zapisu.
3. Zdefiniuj funkcję `czy_palindrom(s)` (np. `return s == s[::-1]` w Pythonie).
4. Dla każdej linii w pliku odczytu:
   a. Wczytaj napis: `napis = linia.strip()`.
   b. Sprawdź warunek: `if czy_palindrom(napis):`
   c. Jeśli 'True', zapisz ten napis do pliku wynikowego: `plik_wynikowy.write(f"{napis}\n")`.

Częste Błędy

Błąd 'Off-by-One' (Prawy wskaźnik)

W metodzie z dwoma wskaźnikami, częstym błędem jest ustawienie prawego wskaźnika na `len(napis)` zamiast `len(napis) - 1`. To spowoduje błąd `IndexError`, bo ostatni indeks to `długość - 1`.

Poprawka: Pamiętaj: lewy wskaźnik zaczyna na `0`, prawy na `len(napis) - 1`.

Błędny warunek pętli `while` (Dwa wskaźniki)

Pisanie `while lewy <= prawy` nie jest błędem, ale jest nieoptymalne. Spowoduje to, że dla słów o nieparzystej długości, środkowy element zostanie porównany sam ze sobą (co jest zbędne).

Poprawka: Używaj warunku `while lewy < prawy`. Pętla naturalnie zatrzyma się, gdy wskaźniki się spotkają lub miną.

Wielkość liter i znaki specjalne

Zadanie może dotyczyć zdań, np. 'Kobyła ma mały bok'. Bezpośrednie odwrócenie da zły wynik z powodu wielkiej litery 'K' i spacji. 'Kajak' to nie to samo co 'kajak'.

Poprawka: Jeśli treść zadania sugeruje ignorowanie wielkości liter i spacji, musisz *przed* sprawdzeniem 'oczyścić' string: `s = s.lower()` (zamiana na małe litery) i `s = s.replace(' ', '')` (usunięcie spacji).

Palindromy liczbowe: Ręczne odwracanie liczby

Uczeń próbuje napisać skomplikowany algorytm matematyczny, który odwraca liczbę (`rev = 0; while n > 0: ...`). To jest trudne, podatne na błędy (np. dla liczb kończących się zerem jak 120) i niepotrzebne.

Poprawka: Zawsze konwertuj liczbę na string (`s = str(n)`) i sprawdzaj string. To jest 100x prostsze i w pełni akceptowalne na maturze.

Kluczowe Wnioski

  • Palindrom to sekwencja (string, liczba), która jest identyczna ze swoją odwrotnością.
  • W Pythonie najprostszy i najszybszy do napisania sposób to `s == s[::-1]`.
  • W C++ najprostsza metoda to pętla `while` z dwoma wskaźnikami (`lewy` i `prawy`).
  • Aby sprawdzić palindrom liczbowy, *zawsze* konwertuj liczbę na string (`str(n)` lub `to_string(n)`).
  • Pamiętaj, że indeksowanie zaczyna się od `0`, a ostatni indeks to `len(s) - 1`.
  • Uważaj na wielkość liter i znaki specjalne - jeśli trzeba, 'oczyść' string przed sprawdzaniem.

Najczęściej Zadawane Pytania

Co dokładnie oznacza `s[::-1]` w Pythonie?

To jest składnia 'cięcia' (slicingu): `[start:stop:krok]`. Pominięcie `start` i `stop` oznacza 'cały string'. Krok `-1` oznacza 'idź od końca do początku, co jeden znak'. W efekcie tworzy to odwróconą kopię stringa.

Czy muszę ręcznie usuwać `\n` (znak nowej linii) przed sprawdzaniem palindromu?

Tak! Jeśli wczytujesz 'kajak\n' z pliku, to jego odwrotność to '\nkajak'. One nie są równe. *Zawsze* używaj `napis = linia.strip()` przed jakimkolwiek przetwarzaniem palindromów.

Jak sprawdzić palindrom liczbowy *bez* zamiany na string?

Musisz ręcznie odwrócić liczbę. Tworzysz pętlę `while n > 0`, `rev = 0`. W pętli: `cyfra = n % 10`, `rev = rev * 10 + cyfra`, `n = n // 10`. Na koniec porównujesz `oryginalna_n == rev`. Jest to jednak bardziej skomplikowane i niezalecane na maturze, jeśli nie jest to wprost wymagane.

Czy metoda z dwoma wskaźnikami jest szybsza niż `s == s[::-1]`?

Teoretycznie tak. Metoda z dwoma wskaźnikami zatrzyma się, gdy tylko znajdzie pierwszą różnicę (np. w 'python' zatrzyma się po pierwszym porównaniu 'p' i 'n'). Metoda `s[::-1]` *zawsze* tworzy cały nowy, odwrócony string (przechodzi całą listę), a dopiero potem je porównuje. W praktyce na maturze obie są błyskawiczne.

Chcesz opanować wszystkie tematy maturalne?

Dołącz do kursu i zyskaj dostęp do interaktywnych lekcji, edytora kodu i setek zadań.

Powiązane Tematy