回文词(Palindromes,UVa401)题解

系统管理员 2022-12-28 04:24 247阅读 0赞

文章目录

  • 题目描述
    • 输入
    • 输出
  • 原题(PDF)
    • 算法分析
    • 解题标程
    • 错题总结

题目描述

输入是一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0 。所谓回文串,就是反转以后和原串相同,如 abba 和 madam 。所谓镜像串,就是左右镜像之后和原串相同,如 2S 和 3AIAE 。

注意,并不是每个字符在镜像之后都能得到一个合法字符。
在本题中,每个合法字符的镜像如下表所示:

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

输入

  1. NOTAPALINDROME
  2. ISAPALINILAPASI
  3. 2A3MEAS
  4. ATOYOTA

输出

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

原题(PDF)

在这里插入图片描述


算法分析

关键点:在判断回文串的同时,判断是否为镜像串。
找到对应字符在镜像表中的对应位置

解题标程

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. const char *rev="A 3 HIL JM O 2TUVWXY51SE Z 8 "; //镜像表
  5. const char *msg[]={
  6. "not a palindrome","a regular palindrome","a mirrored string","a mirrored palindrome"};
  7. //字符在镜像表中的对应位置
  8. char r(char ch)
  9. {
  10. if(isalpha(ch)) //isalpha()用于判断字符是否为字母
  11. return rev[ch-'A']; //镜像表中前26个均为字母排序
  12. return rev[ch-'0'+25]; //镜像表中26个字典序结束后即为数字
  13. }
  14. int main()
  15. {
  16. char s[30];
  17. while(scanf("%s",s)==1){
  18. int len=strlen(s);
  19. int p=1,m=1; //回文串与镜像串的标志
  20. for(int i=0;i<(len+1)/2;i++){
  21. if(s[i]!=s[len-1-i]) p=0; //非回文串
  22. if(r(s[i])!=s[len-i-1]) m=0; //非镜像串
  23. }
  24. printf("%s -- is %s.\n",s,msg[m*2+p]); //用(m*2+p)的值巧妙的统一输出
  25. }
  26. return 0;
  27. }

错题总结

  • 1、先进行回文串的判断,再进行镜像串的判断。二者判断可同时进行。
  • 2、 头文件中定义的isalpha、isdigit、isprint等工具可以用于判断字符的属性
  • isalpha():用于判断是否为字母
  • isdigit():用于判断是否为数字
  • isprint():用于判断是否为可打印字符

在这里插入图片描述

  • 3、标程中的 msg[m*2+p] 的巧妙统一输出,可以多进行思考、借鉴。

发表评论

表情:
评论列表 (有 0 条评论,247人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++

    输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0。所谓回文串,就是反转以后和原串相同,如abba和madam。 所有镜像串,就是左右镜像之后和原串相同

    相关 TOJ4959: 近似

    描述 输入一行文本,输出最长近似回文词连续子串。所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,