一. 题意
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,"A man, a plan, a canal: Panama"
is a palindrome."race a car"
is not a palindrome.
Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.
For the purpose of this problem, we define empty string as valid palindrome.
思路:验证一个给定的字符串是否为回文,首先,如果遇到非字符和数字的符号(如标点符号)一律跳过 .isalnum(),同时,若遇到大写字母就转换为小写字母( .lower() );其次,用双指针left和right分别指向字符串的首尾,判断是否相同,若相同,指针left和right都向中间移动 1位,判断下一组,左指针小于右指针就一直循环;若不相同,直接返回False。
in short: 跳过非字符 非数字.isalnum() + 统一转化为小写字母进行比较.lower() + 双指针
C++版:
bool isPalindrome(string s){
int left = 0, right = s.size()-1;
while (left<=right){
while(left <right && !isalnum(s[left])) left++; //去除字符(非字母 非数字)
while(left < right && !isalnum(s[right])) right--; //去除字符(非字母 非数字)
//if(toupper(s[l]) != toupper(s[r])) return false;
if ((s[left] + 32 -'a')%32 != (s[right] + 32 -'a')%32)
return false;
left++, right--;
}
return true;
while(left < right){
if(!isalnum(s[left])) left++;
else if (!isalnum(s[right])) right--;
else if ((s[left] + 32-'a')%32 != (s[right] + 32 - 'a')%32)
return false
else{
left++, right--;
}
}
return true;
}
python版:
def isPalindrome(s):
i, j = 0, len(s) -1
while i <j :
while i<j and not s[i].isalnum():
i +=1
while i<j and not s[j].isalnum():
j -=1
if s[i].lower() != s[j].lower():
return False
return True
reference:
www.cnblogs.com/lightwindy/p/8553509.html
blog.csdn.net/coder_orz/article/details/51304295