【问题】给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false
【思路】
这个思路很好想,我们利用双指针l和r,从字符串两端开始比较每个字符,如果字符不相同,则返回false。如果相同,则l++,r--,向中间靠拢。
但关键的关键,就是检测每个字符有效,并忽略字母大小写。并且程序还要解决一个字符串没有有效字母的情况!
字母大小写转换的快捷方法:
统一转成大写:ch & 0b11011111 简写:ch & 0xDF
统一转成小写:ch | 0b00100000 简写:ch | 0x20
【题解】
class Solution { public: bool isvalid(char c){ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')){ return false; } return true; } bool isPalindrome(string s) { if(s == "") return true; int l = 0, r = s.length() - 1; while(l < r){ while(isvalid(s[l]) && (l <r)) l++; while(isvalid(s[r]) && (l <r)) r--; if (l < r){ if((s[l++] | 0x20) != (s[r--] | 0x20)){ return false; } } } return true; } };