[D-OJ 练习] (取余优化) 判断一个字符串不区分大小写是否回文
输入描述
输入一个字符串,以#号结束,不包含空格,占一行
输出描述
判断字符串不区分大小写是否回文,是输出YES,否则输出NO。
输入样例
MadaDAm#
输出样例
YES
写的时候在判断大小写上有了一些想法,可以省去一些步骤,根据的是大小写字母的ASCII码值差为32,所以我们不必像下面这样特意判断 ...他们各自究竟是大写还是小写,也不必判断字符串的大小为奇还是偶,否则遇到 abCba 这类的便会出问题...
啰嗦且不完备的写法👇
if((s[i]>='a' && s[i]<='z') || ){
if(s[len-1-i] != s[i]-32){
ret=1;
break;
}
}else if((s[i]>='A'&& s[i]<='Z')){
if(s[len-1-i] != s[i]+32){
ret=1;
break;
}
}
else if(s[i] != s[len-1-i]){
ret=1;
break;
}
💡思考了一下还是取余更为精妙(不必判断是大写还是小写,也不必判断自身是否在字符串的中心位置)
if((s[i]>='a' && s[i]<='z') || (s[i]>='A'&& s[i]<='Z')){
if((s[len-1-i]-s[i])%32){
ret=1;
break;
}
}else if(s[i] != s[len-1-i]){
ret=1;
break;
}
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
char s[1000];
scanf("%s", s);
int len = strlen(s)-1;
int ret = 0;
for(int i=0; i<=len/2; i++)
{
if((s[i]>='a' && s[i]<='z') || (s[i]>='A'&& s[i]<='Z')){
if((s[len-1-i]-s[i])%32){
ret=1;
break;
}
}else if(s[i] != s[len-1-i]){
ret=1;
break;
}
}
if(ret) printf("NO");
else printf("YES");
return 0;
}
本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/15799061.html