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
思路
从例子中可以看出,在进行对比的时候会遇到非字母和数字的字符,这个和之前做的回文判断很相似,只不过这里需要对当前位置的异常情况进行判断和处理。就是当前字符如果是". : ,"等等时,需要将下标移动到下一位在进行判断。在python中字符串有一个方法就是isalnum()用来判断当前字符是否是字母和数字。其他的和之前做的回文判断都一样。时间复杂度为O(n),空间复杂度为O(1)。
解决代码
1 class Solution(object):
2 def isPalindrome(self, s):
3 """
4 :type s: str
5 :rtype: bool
6 """
7 if not s or len(s) == 1: # 空或者只有一个时直接返回结果
8 return True
9 start, end = 0, len(s) -1 # 首尾指针
10 while start < end:
11 while start < end and not s[start].isalnum(): # 判断当前字符是否是字符或者数字
12 start += 1
13 while end > start and not s[end].isalnum(): # 同上
14 end -= 1
15
16 if s[start].lower() != s[end].lower(): # 如果当前不相等,直接返回结果
17 return False
18 start += 1
19 end -= 1
20 return True # 遍历完毕,说明是回文。返回结果。