125. Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
Example 1:
Input:
"A man, a plan, a canal: Panama"
Output:
true
Example 2:
Input:
"race a car"
Output:
false
Thoughts:
- Lower-case the string and have two pointers starting from first and last to check the legit characters until two pointers cross each other over
Code: Two pointers explicit
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
s = s.lower()
i , j = 0, len(s) - 1
while i <= j:
while i < j and not s[i].isalnum(): # must be i < j in order to prevent index out of range. e.g ".,"
i +=1
while i < j and not s[j].isalnum(): # must be i < j in order to prevent index out of range. e.g ".,"
j -= 1
if s[i] != s[j]: return False
i+= 1; j -= 1
return True
Code: Two pointers implicit (by comparing the reverse of the string itself)
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
s = ''.join(e for e in s if e.isalnum()).lower()
return s == s[::-1]