Program do sprawdzania czy string jest palindromem

Program do sprawdzania czy string jest palindromem
IN
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:8
0

Mam program do sparwdzania czy string jest palindromem. Program działa ale jest dosyć mocno skomplikowany. Ma ktoś pomysł na coś prostszego? Pozdrawiam

Kopiuj
def Palindrome(s): 
    l, h = 0, len(s) - 1
    s = s.lower() 
  
    while (l <= h): 
        if (not(s[l] >= 'a' and s[l] <= 'z')): 
            l += 1
        elif (not(s[h] >= 'a' and s[h] <= 'z')): 
            h -= 1
        elif (s[l] == s[h]): 
            l += 1
            h -= 1
        else: 
            return False
    return True
    
s = "Madam, I'm Adam."
if (Palindrome(s)): 
    print("True")
else: 
    print("False")
    
edytowany 1x, ostatnio: cerrato
AN
  • Rejestracja:około 19 lat
  • Ostatnio:dzień
1

Można podzielić algorytm na dwa etapy:

  1. Oczyszczenie napisu, czyli usunięcie znaków innych niż litery, ujednolicenie wielkości liter (zamiana na same małe). W Twoim przykładzie oczyszczony napis ma postać "madamimadam".
  2. Właściwe sprawdzenie oczyszczonego napisu, wystarczy prosta iteracja tyle razy, ile wynosi połowa długości napisu (w praktyce nie jest ważne, w którą stronę zaokrągli się połowę nieparzystej długości, przy zaokrągleniu w górę na końcu porówna środkowy znak z środkowym znakiem, a te dwa znaki będą zawsze takie same, bo jest to jeden i ten sam znak), po czym funkcja zwraca true. Jednak w każdej iteracji porównuje się s[i] z s[l - i], gdzie l to długość napisu pomniejszona o 1. Jeżeli s[i] != s[l - i] to od razu przerywa się pętlę i zwraca się false.
edytowany 2x, ostatnio: andrzejlisek
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około 4 godziny
  • Postów:6670
3
Kopiuj
def filterStr(s):
	return ''.join(c for c in s if c.isalnum()).lower()

def isPalindrome(s):
	filtered = filterStr(s)
	return filtered[:int(len(filtered)/2)] == filtered[-int(len(filtered)/2):][::-1]
	
print(isPalindrome("Madam, I'm Adam."))

Pewnie zaraz przyjdzie tu jakiś "azjata", który zrobi to lepiej :D


🕹️⌨️🖥️🖱️🎮
edytowany 3x, ostatnio: Spine
spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
3

Jeżeli zależy ci na prostocie:

Kopiuj
def is_palindrome(str):
	str = ''.join([c for c in str.lower() if c.isalpha()])
	return str == str[::-1]
	
print(is_palindrome("Madam, I'm adam.")) 
IN
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:8
1

Dzięki, skrócone to minimum :D

  • Rejestracja:około 6 lat
  • Ostatnio:ponad rok
0
Kopiuj
>>> S='a'*10**8+'x'
>>> %timeit inkanus(S)
135 ms ± 958 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
>>> %timeit spine(S)
15.2 s ± 31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit spartan(S)
11.5 s ± 5.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit mozg(S)
969 ns ± 3.99 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>>
Shalom
a twoja funkcja pewnie return False xD

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.