LeetCode/NeetCodeRoadmap/Two_Pointers/125_Valid_Palindrome.py

67 lines
2.1 KiB
Python

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