UVA401 回文词 Palindromes 题解

爱吃糖的徐菜菜 2022-01-17 20:44:39

题意翻译

输入是一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字00 。所谓回文串,就是反转以后和原串相同,如abbaabb**a 和madammadam 。所谓镜像串,就是左右镜像之后和原串相同,如2S2S 和3AIAE3AIA**E 。注意,并不是每个字符在镜像之后都能得到一个合法字符。在本题中,每个合法字符的镜像如下表所示:

Character   Reverse
A           A
E           3
H           H
I           I
J           L
L           J
M           M
O           O
S           2
T           T
U           U
V           V
W           W
X           X
Y           Y
Z           5
1           1
2           S
5           Z
8           8

输入的每行包含一个字符串(保证只有上述字符,不含空白字符),判断它是否为回文串和镜像串(共4种组合)。

输入输出样例

输入 #1

NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA

输出 #1

NOTAPALINDROME -- is not a palindrome.
ISAPALINILAPASI -- is a regular palindrome.
2A3MEAS -- is a mirrored string.
ATOYOTA -- is a mirrored palindrome.

分析

回文串判断只需要用str[i]与str[len - 1 - i]进行判断,重点在镜像串的判断.

思路1:

使用if - else语句把所有镜像情况列出来,代码段:

int checkMirrored(char low, char high) {
    if (low == 'A') {
        if (high == 'A') {
            return 1;
        }
        else return 0;
    }
    else if (low == 'E') {
         if (high == '3') {
            return 1;
        }
        else return 0;
    }    
    else if (low == 'H') {
        if (high == 'H') {
            return 1;
        }
        else return 0;
    }
    else if (low == 'I') {
        if (high == 'I') {
            return 1;
        }
        else return 0;
    }    
    else if (low == 'J') {
        if (high == 'L') {
            return 1;
        }
        else return 0;
    }    
    else if (low == 'L') {
        if (high == 'J') {
            return 1;
        }
        else return 0;
    }    
    else if (low == 'M') {
        if (high == 'M') {
            return 1;
        }
        else return 0;
    }    
    else if (low == 'O') {
        if (high == 'O') {
            return 1;
        }
        else return 0;
    }    
    else if (low == 'S') {
        if (high == '2') {
            return 1;
        }
        else return 0;
    }
        else if (low == 'T') {
        if (high == 'T') {
            return 1;
        }
        else return 0;
    }
        else if (low == 'U') {
        if (high == 'U') {
            return 1;
        }
        else return 0;
    }
        else if (low == 'V') {
        if (high == 'V') {
            return 1;
        }
        else return 0;
    }
        else if (low == 'W') {
        if (high == 'W') {
            return 1;
        }
        else return 0;
    }
        else if (low == 'X') {
        if (high == 'X') {
            return 1;
        }
        else return 0;
    }
        else if (low == 'Y') {
        if (high == 'Y') {
            return 1;
        }
        else return 0;
    }    
    else if (low == 'Z') {
        if (high == '5') {
            return 1;
        }
        else return 0;
    }
        else if (low == '1') {
        if (high == '1') {
            return 1;
        }
        else return 0;
    }
        else if (low == '2') {
        if (high == 'S') {
            return 1;
        }
        else return 0;
    }
        else if (low == '5') {
        if (high == 'Z') {
            return 1;
        }
        else return 0;
    }
        else if (low == '8') {
        if (high == '8') {
            return 1;
        }
        else return 0;
    }
        else if (low == '3') {
            if (high == 'E') {
                return 1;
            }
            else return 0;
        }    
    else {
        return 0;
    }    
}

思路2(参考洛谷题解):

使用重定向的输入方法,把镜像对应表复制到data.in文件中,打印对应表到data.out文件中,代码段:

int mir() {
    freopen("data2.in", "r", stdin);
    freopen("data2.out", "w", stdout);
    char a, b;
    while (cin >> a >> b) {
        printf("mir['%c'] = '%c';\n",a, b);
    }
    return 0;
}

思路3(紫书答案):

分成字母和数字,在26个字母对应的位置上,填入对应镜像,在1-9数字的对应位置上,也填上对应镜像.

#include <stdio.h>
#include <string.h>
#include <ctype.h>
const char mir[] = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";
const char *ans[] = {"not a palindrome", "a regular palindrome", "a mirrored string",
    "a mirrored palindrome"}; 
int main() {
    char str[100];
    while (scanf("%s", str) == 1) {
        int len = strlen(str);
        // 判断回文
        int flag1 = 1; 
        // 判断镜像
        int flag2 = 1;
        for (int i = 0; i <= len / 2; i++) {
            if (str[i] != str[len - 1 - i]) {
            flag1 = 0;
            }
            if (checkMir(str[i]) != str[len - 1 - i]) {
            flag2 = 0;
            }
        }
        printf("%s -- is %s.\n\n", str, ans[flag2 * 2 + flag1]);
    }
    return 0;
}                           
...全文
115 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,632

社区成员

发帖
与我相关
我的任务
社区描述
欢迎大家来到抱团内卷学习社区,在这里大家可以分享自己的学习笔记,求职心得,一起记录彼此的成长历程。社区群号:94108843,WX公众号:【兴趣使然的草帽路飞】
社区管理员
  • 路  飞
  • 一百个Chocolate
  • 灰小猿
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

最怕你一生碌碌无为,还安慰自己平凡可贵!

努力提高自己的知识储备,助力每一位冲刺大厂的小伙伴!

祝大家前程似锦,offer连连!

注意:每个月活跃积分最高的小伙伴,可以获得社区管理员权限哦!

试试用AI创作助手写篇文章吧