Jeden z najstarszych szyfrów podstawieniowych — każdą literę przesuwamy o stałą liczbę pozycji w alfabecie (klucz). Deszyfrowanie to przesunięcie w przeciwną stronę.
Ma tylko 25 możliwych kluczy — można go złamać metodą brute-force w ułamek sekundy, sprawdzając wszystkie przesunięcia i wybierając to, które daje sensowny tekst.
Sprawdzanie anagramu przez sortowanie liter ma złożoność \(O(n \log n)\). Jeśli chcemy przyspieszyć działanie do czasu liniowego \(O(n)\), możemy zliczyć wystąpienia liter za pomocą słownika (lub tablicy zliczeń):
Zadanie: znaleźć wszystkie wystąpienia wzorca (o długości m) w tekście (o długości n). Metoda naiwna: dla każdej możliwej pozycji początkowej w tekście porównujemy znak po znaku ze wzorcem.
Złożoność tej metody w najgorszym przypadku to O(n × m) — dla każdej z n-m+1 pozycji możemy wykonać do m porównań.
Napisz funkcję, która automatycznie łamie szyfr Cezara metodą brute-force: sprawdza wszystkie 25 możliwych kluczy i wypisuje wszystkie odszyfrowane wersje, aby człowiek mógł wybrać tę sensowną.
Mając dane zdanie, znajdź najdłuższy pojedynczy wyraz będący palindromem (pomijając wielkość liter). Wykorzystaj funkcję czy_palindrom i metodę .split().
czy_palindrom(s): s.lower() – zamienia wszystkie litery na małe, aby wielkość liter nie wpływała na wynik (np. "Kajak" zmieni się na "kajak"). s[::-1] to tzw. slicing w Pythonie (czytanie od tyłu z krokiem -1).znaki_interpunkcyjne): Zapobiega sytuacji, w której wyraz z kropką lub przecinkiem (np. "kajak.") nie zostałby rozpoznany jako palindrom.zdanie.split(): Dzieli ciąg znaków wszędzie tam, gdzie występuje spacja, tworząc listę słów ['Znasz', 'ten', 'owoc', ...].for i warunek and): Zaczynamy z pustym napisem najdluzszy = "". Dla każdego słowa sprawdzamy czy jest palindromem oraz czy jego długość jest ściśle większa od dotychczasowego maksimum (len(wyraz) > len(najdluzszy)). Dzięki temu słowo "potok" (5 liter) nie nadpisze wcześniejszego "kajak" (5 liter), zachowując pierwsze najdłuższe wystąpienie.W przypadku wyszukiwania wzorca (Punkt 3) uczniowie często zapominają, dlaczego pętla wykonuje się do indeksu n - m + 1. Wyjaśnienie: Przeszukiwanie tekstu kończymy w momencie, gdy do końca tekstu zostało mniej znaków, niż wynosi długość wzorca – dalsze sprawdzanie nie ma sensu matematycznego.
1. Ile możliwych kluczy ma klasyczny szyfr Cezara (alfabet łaciński)?
2. Jaka jest złożoność czasowa naiwnego wyszukiwania wzorca w tekście?
3. Która metoda sprawdzenia, czy dwa słowa są anagramami, ma złożoność O(n log n)?