125 验证回文串
题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
**说明:**本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
题解
每次在leetcode
都能遇到神奇的解法
【转换字母大小写】
ch & 0b11011111 //ch & 0xDF ---全部转换为大写
ch | 0b00100000 //ch & 0x20 ---全部转换为小写
—来自 simplehippo
的评论
这里自己想了一下,真是巧妙,因为小写和大写字母刚好相差32,而32就是二进制下的第5位,与上第5位的0相当于减32,或上第5位的1则相当于加上32,妙,妙就完事了。
(65–‘A’ 97–‘a’)
【关于这一题回文串的想法】
这里最直接的想法就是从最左到最右进行匹配,向中间缩进,匹配成功则是回文串,反之则不是。(目前还没想到什么比较快的思路)
class Solution {
public:
bool isPalindrome(string s) {
int l = 0,r = s.length()-1;
while(l<=r){
while((0 == isalnum(s[l])) && l<r) ++l; //isalnum()判断是否是数字或者是字母,返回0则不是字母也不是数字,数字返回值是1,字母返回值是2
while((0 == isalnum(s[r])) && r>l) --r;
if(tolower(s[r]) != tolower(s[l])) return false;
++l,--r;
}
return true;
}
};
但是这还是太慢了,后面再改进吧…