import string import math # def isPalindrome(s): # """ # :type s: str # :rtype: bool # """ # # Create a translation table to remove uppercase letters and special characters # # translation_table = str.maketrans("","", string.punctuation + string.whitespace) # translation_table = ''.join(c.lower() if c.isupper() or c.isalnum() else '' for c in s if c.isalnum() or c in string.whitespace) # # print(translation_table) # if len(translation_table) == 2: # if translation_table[0] == translation_table[1]: # return True # else: # return False # # Use the translation table to remove uppercase letters and special characters # # upper_string = s.translate(translation_table) # # lower_string = upper_string.lower() # lower_string = translation_table # half = len(lower_string)/2 # # Round the value down since middle value doesn't matter # if len(lower_string)%2 != 0: # halfdown = int(math.floor(half)) # else: # halfdown = int(half) # # print(halfup) # # print(halfdown) # first = [] # second = [] # print(lower_string) # for i in range(halfdown): # # print(i) # # print(lower_string[i]) # first.append(lower_string[i]) # if len(lower_string)%2 != 0: # for j in range(halfdown+1, len(lower_string)): # second.insert(0, lower_string[j]) # else: # for j in range(halfdown, len(lower_string)): # second.insert(0, lower_string[j]) # print(first) # print(second) # if first == second: # return True # else: # return False #Fastest solution # Operator ~ is the bitwise NOT operator (~x == -x-1 => ~0 == -1 => ~1 == -2 and etc), # which expects just one argument. It performs logical negation on a given number by # flipping all of its bits: def isPalindrome(s: str) -> bool: s = [c.lower() for c in s if c.isalnum()] return all (s[i] == s[~i] for i in range(len(s)//2)) print(isPalindrome("A man, a plan, a canal: Panama")) print(isPalindrome("aa")) print(isPalindrome("0P")) print(isPalindrome("abba"))