题目链接
给定一个字符串,判断是不是回文字符串。只考虑字符串中的数字、字母,并且同一个字母的大写和小写是等价的。
例如:
A man, a plan, a canal: Panama 是回文。
race a car 不是回文。
注意:在这道题目中,我们认为 空串是回文字符串。
输入格式
输入有多行,以 EOF 结束。每行输入一个长度不超过 500 的字符串。
输出格式
对于每行输入,判断是否是符合题目要求的回文。如果是,则输出一行 true;否则输出一行 false。
样例输入
Live on evasions? No, I save no evil.
样例输出
true
解题思路:
1.string类型 s 的s.erase()的三种方式
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position); 删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
2.s.erase();删除之后,从下一个字符开始[尤!其!重!要!]
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
string s,x;
while(getline(cin,s)){//string类型以 EOF 结束 while(getline(cin,s)){}
for(int i = 0;i < s.size();i++){
if(s[i] >= 'a' && s[i] <= 'z')
s[i] = s[i] - 'a' + 'A';
else if(s[i] >= 'A' && s[i] <= 'Z' || s[i] >= '0' && s[i] <= '9')
continue;
else{
s.erase(i,1);
i--;//从下一个字符开始,接下来要进行i++,所有在此时要i--,把接下来的i++给抵消掉
}
}
x = s;
reverse(s.begin(),s.end());//注意reserve的用法。。。。。。好久不用都忘了。。。。。
if(x == s)
printf("true\n");
else
printf("false\n");
}
return 0;
}