JSK-58 合法回文【字符串】

合法回文
给定一个字符串,判断是不是回文字符串。只考虑字符串中的数字、字母,并且同一个字母的大写和小写是等价的。
例如:
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;
}

猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/82935356
今日推荐