合法回文

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

例如:

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




头尾指针模拟找

#include<bits/stdc++.h>
using namespace std;
int main(){
	int len,l,r,flag;
	string str,tmp;
	while(getline(cin,str)){
		for(int i = str.size() - 1;i >= 0;i--){
			if(str[i] >='0'&&str[i]<='9'||str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z'){
				if(str[i] >= 'A' && str[i] <= 'Z') str[i] += 32;
			} 
			else str.erase(i,1);
		}		
		l = 0,flag = 1,r = str.size() - 1;
		while(l <= r){
			if(l == r){
				l++,r--;
				break;
			}
			else{
				if(str[l] != str[r]){
					flag = false;
					break;
				}
				l++,r--;
			}
		}
		if(!flag) printf("false\n");
		else printf("true\n");
	}	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值