合法回文

题目链接
给定一个字符串,判断是不是回文字符串。只考虑字符串中的数字、字母,并且同一个字母的大写和小写是等价的。

例如:

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);删除从firstlast之间的字符(firstlast都是迭代器)

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;
}



猜你喜欢

转载自blog.csdn.net/qq_37708702/article/details/80187667