题目
请点击
思路
- 首先例外情况,当字符串为空时,也是回文串,返true
- 双指针遍历,i=0,j=len-1,循环条件i<j
若s[i]或s[j]不是字母或数字时,直接跳过
若s[i]或s[j]是大写字母时,转成小写字母
若s[i]!=s[j]时,说明不是回文串,返回false - 遍历结束,返回true,(s[i]与s[j]全相等)
踩坑
- 起初采用的循环条件是i!=j,结果直接报错
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415211151889.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Rod3d1,size_16,color_FFFFFF,t_70)
大概的意思是越界了
然后,仔细想了下,确实是,如果字符串的长度是偶数,比如给出的"aa",那么第一次循环i=0,j=1,然后,i++,j–后,再次i++,j–时,就越界了,所以用i<j
代码
#include<iostream>
#include<cctype>
using namespace std;
bool isPalindrome(string s) {
int len=s.length();
if(len==0) return true;
int i=0,j=len-1;
while(i<j){
if(!isalnum(s[i])){
i++;
continue;
}
if(!isalnum(s[j])){
j--;
continue;
}
if(isupper(s[i])) s[i]=tolower(s[i]);
if(isupper(s[j])) s[j]=tolower(s[j]);
if(s[i]!=s[j]) return false;
i++;
j--;
}
return true;
}
int main(){
string str;
cin>>str;
bool flag=isPalindrome(str);
cout<<flag<<endl;
return 0;
}