题目简介:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
1 2
| 输入: "A man, a plan, a canal: Panama" 输出: true
|
示例 2:
1 2
| 输入: "race a car" 输出: false
|
思路:
由于不考虑大小写的问题,使用transform()
函数将字符串中的字符都转换为大写。
利用双指针,初始化指向字符串的开头和末尾,由于只考虑数字和字母,所以指针指向的值不为数字和字母的话,便向后或向前移动,直至找到数字或字母即可。
tips:
- 注意边界的问题
- 学会
isalpha()
和isdigit()
函数,方便判断
- transform()函数的定义,
transform(s.begin(), s.end(), s.begin(), ::toupper)
便将字符串中的字符都转化为大写。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public: bool isPalindrome(string s) {
int left = 0; int right = s.length() - 1;
transform(s.begin(), s.end(), s.begin(), ::toupper);
while(left < right){
while(left < s.length() && !isalpha(s[left]) && !isdigit(s[left])) left++; while(right >= 0 && !isalpha(s[right]) && !isdigit(s[right])) right--; if(left < right && s[left] != s[right]) return false; left++; right--; }
return true;
} };
|