合法回文
给定一个字符串,判断是不是回文字符串。只考虑字符串中的数字、字母,并且同一个字母的大写和小写是等价的。
例如:
A man, a plan, a canal: Panama 是回文。
race a car 不是回文。
注意:在这道题目中,我们认为 空串是回文字符串。
输入格式
输入有多行,以 EOF 结束。每行输入一个长度不超过 500 的字符串。
输出格式
对于每行输入,判断是否是符合题目要求的回文。如果是,则输出一行 true;否则输出一行 false。
样例输入
Live on evasions? No, I save no evil.
样例输出
true
问题链接:JSK-58 合法回文
问题描述:(略)
问题分析:
回文问题,通过左右2个指针(实际为下标)进行比较,2个指针逐步往中间收缩。
需要注意字符转换和跳过无关的字符。
程序说明:
头文件ctype.h中声明了字符有关的判断和转换函数(实际上多为宏定义)。尽量使用这些函数则使得程序代码更加简洁,并且不易产生BUG。
参考链接:(略)
题记:能不用库函数则用库函数。
AC的C语言程序如下:
/* JSK-58 合法回文 */
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 500
char s[N + 1];
int main(void)
{
while(gets(s) != NULL) {
int left = 0;
int right = strlen(s) - 1;
int flag = 1;
while(left < right) {
if(!isalnum(s[left])) {
left++;
continue;
}
if(!isalnum(s[right])) {
right--;
continue;
}
char a = (isalpha(s[left]) && isupper(s[left])) ? tolower(s[left]) : s[left];
char b = (isalpha(s[right]) && isupper(s[right])) ? tolower(s[right]) : s[right];
if(a != b) {
flag = 0;
break;
} else
left++, right--;
}
// 输出结果
printf("%s\n", flag ? "true" : "false");
}
return 0;
}