给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
思路:
因为验证的除了字符还有数字,所以必须把字符串全转换成小写才可以判断,因为我们判断大小写相等是依据大小写的ASCII码相差32来判断的,而加入了数字,就不能用这个方法判断了,比如:0和P,相差32,但一个是数字一个是字符,不符合我们判断大小写相等的情况。
所以,先把字符串转换成小写
然后用一个前标志 i 一个后标志 j ,如果前标志不是字符或者数字,则i++跳过,同样,后标志如果不是字符或者数字,则j--跳过,
一直到不跳过为止,判断s[i]和s[j]是否相等,如果不相等,则直接返回false,如果相等,则i++,j--继续下一轮判断
代码:
class Solution {
public:
bool isPalindrome(string s) {
if(s.length()==1)
return 1;
transform(s.begin(),s.end(),s.begin(),::tolower); //转换成小写
int i=0,j=s.length()-1;
while(i<j)
{
for(;i<j;i++) //前标志一直跳过直到它是字符或数字为止
{
if((s[i]>='a'&&s[i]<='z') || (s[i]>='0'&&s[i]<='9'))
break;
}
for(;i<j;j--) //后标志一直跳过直到它是字符或数字为止
{
if((s[j]>='a'&&s[j]<='z') || (s[j]>='0'&&s[j]<='9'))
break;
}
if( (s[i]-'a')%32==(s[j]-'a')%32) //判断前标志和后标志是否相等
{
i++; //如果相等执行下一个循环
j--;
}
else
return 0; //如果不相等,直接返回false
}
return 1; //循环后都没问题的话,则证明是对的,返回true
}
};