验证回文串
1. 题目描述
给定一个字符串,验证它是否是回文串。只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例
输入:“A man, a plan, a canal : Panama”
输出: true
解释:“amanaplanacanalpanama” 是回文串
2. 解法
2.1 我的解法
我的想法是遍历字符串,判断当前字符是不是数字和字母。如果不是,就删除当前字符;如果是大写字母,就转为小写字母。
class Solution {
public:
bool isPalindrome(string s)
{
//如果字符串长度为0,则为回文串
if(!s.length()) return true;
int len = s.length();
//遍历字符串
for (int i = 0; i < len;++i)
{
//如果该字符为大写字母,转为小写字母
if (s[i] >= 'A' && s[i] <= 'Z')
{
s[i] = s[i] + 32;
}
//如果不为数字或者字母
if (s[i] < 48 || (s[i] > 57 && s[i] < 65) || (s[i] > 90 && s[i] < 97) || s[i] > 122)
{
//删掉该位置的字符
s.erase(i, 1);
//这时候字符长度-1
--len;
//标记位置-1
--i;
}
}
//左右指针,双指针验证回文串
int l = 0, r= len-1;
while(l < r)
{
if(s[l] != s[r]) return false;
++l;
--r;
}
return true;
}
};
2.2 调用isalnum
好吧,我对字符串的各种处理函数不熟悉,居然不知道这么一个可以判断字符是否为数字或者字母的函数。
isalnum©,返回一个布尔值,如果参数为数字或者字母,就返回true。
这里的代码没有对原字符串进行修改,用另一个字符串存储处理好的小写字符。
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);
}
}
string sgood_rev(sgood.rbegin(), sgood.rend());
return sgood == sgood_rev;
}
};