Program do sprawdzania czy string jest palindromem

0

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

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")
    
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.
3
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

3

Jeżeli zależy ci na prostocie:

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.")) 
1

Dzięki, skrócone to minimum :D

0
>>> 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)
>>>

1 użytkowników online, w tym zalogowanych: 0, gości: 1