diff --git a/NeetCodeRoadmap/Arrays_and_Hashing/125_Valid_Palindrome.py b/NeetCodeRoadmap/Arrays_and_Hashing/125_Valid_Palindrome.py index ef6d5ee..56b0dcb 100644 --- a/NeetCodeRoadmap/Arrays_and_Hashing/125_Valid_Palindrome.py +++ b/NeetCodeRoadmap/Arrays_and_Hashing/125_Valid_Palindrome.py @@ -1,57 +1,65 @@ 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 +# 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 + # # 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) + # 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]) + # 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]) + # 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]) + # 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 + # 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"))