The original question can be found here.
The question is asking for a given string, determine if it’s palindromic. Only alphanumeric letters are taking into account and letters’ cases are ignored.
Reverse and Compare
The first solution we can think of is create a new string by filtering out the non-alphanumeric letters, and another new string by reversing the first newly created string, then we compare if these new 2 created strings are the same.
class Solution:
def isPalindrome(self, s: str) -> bool:
filtered_string = "".join(char.lower() for char in s if char.isalnum())
return filtered_string == filtered_string[::-1]
The time complexity is O(n), space complexity is O(n) since we create a couple of new strings.
2 Pointers
From time complexity perspective, we cannot do better. However, we can improve the space complexity by using 2 pointers. We use a pointer start traversing the string from left to right, and another pointer from right to left:
class Solution:
def isPalindrome(self, s: str) -> bool:
left, right = 0, len(s) - 1
while left < right:
while left < right and not self.is_valid(s[left]):
left += 1
while left < right and not self.is_valid(s[right]):
right -= 1
if left < right:
if s[left].lower() != s[right].lower():
return False
left += 1
right -= 1
return True
def is_valid(self, s: str) -> bool:
return s.isalnum()
Time complexity: O(n). Space complexity: O(1).