【紫书】例题3-3 回文词(Palindromes, UVa401)

【题目描述】

输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0.所谓回文串,就是反转以后和原串相同,如abba和madam。所有镜像串,就是左右镜像之后和原串相同,如2S和3AIAE。注意,并不是每个字符在镜像之后都能得到一个合法字符。在本题中,每个字符的镜像如图所示(空白项表示该字符镜像后不能得到一个合法字符)。

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

【样例输入】

NOTAPALINDROME

ISAPALINILAPASI

2A3MEAS

ATOYOTA

【样例输出】

NOTAPALINDROME  --  is not a palindrome.

ISAPALINILAPASI  --  is a regular palindrome.

2A3MEAS --  is a mirrored string.

ATOYOTA  --  is a mirrored palindrome.

【代码实现】

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <ctype.h>
 5
 6 #define MAX (int)1e4
 7
 8 using namespace std;
 9
10 const char RS[] = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";  // 常量字符数组,存对应镜像字符
11
12 char rev( char c )
13 {
14     if ( isalpha(c) ) return RS[c - ‘A‘];  // 注意下标的处理
15     else return RS[c - ‘0‘ + 25];
16 }
17
18 int main()
19 {
20     char s[MAX];
21     while ( scanf ("%s", s) == 1 ) {
22         int len = strlen(s);
23         int P = 1, M = 1;
24         for ( int i = 0; i < (len+1) / 2; i++) {  // 判断到一半即可停止,+1为了包含最中间字符的自身比较,用于镜像判断
25             if ( s[i] != s[len - 1 - i] )  P = 0;
26             if ( rev(s[i]) != s[len - 1 -i] ) M = 0;
27         }
28         if ( P && M ) printf ("%s is a mirrored palindrome.\n\n", s);
29         if ( P && !M ) printf ("%s is a regular palindrome.\n\n", s);
30         if ( !P && M ) printf ("%s is a mirrored string.\n\n", s);
31         if ( !P && !M ) printf ("%s is not a palindrome.\n\n", s);
32     }
33
34     return 0;
35 }

【总结】

只能说作者太强了。。看作者的代码非常过瘾,思路清晰,也没有多余的地方。现在的能力远远达不到这种水平,可以说是有了榜样吧。

但关于书中代码

const char* msg[] = {"not a palindrome", "a regular palindrome", "a mirrored string", "a mirrored palindrome"};

以及对应的 printf ("%s -- is %s.\n\n", s, msg[m*2+p]); 个人觉得并没有十分的必要,这样费尽心思地去另建全局字符串数组,还要去考虑数组下标的实现细节,反不如四个逻辑判断来的清晰爽快。

原文地址:https://www.cnblogs.com/lilinilil/p/8450121.html

时间: 2024-10-13 23:12:13

【紫书】例题3-3 回文词(Palindromes, UVa401)的相关文章

回文词 (Palindromes,Uva401)

例题 3-3 回文词 (Palindromes,Uva401) 输入一个字符中,判断它是否为回文串以及镜像串.输入字符串保证不含数字0.所谓回文串,就是反转以后和原串相同,如abba和madam.所有镜像串,就是左右镜像之后和原串相同,如2S和3AIAE.注意,并不是每个字符在镜像之后都能得到一个合法字符.在本题中,每个字符的镜像如图3-3所示(空白项表示该字符镜像后不能得到一个合法字符). 输入的每行包含一个字符串(保证只有上述字符.不含空白字符),判断它是否为回文串和镜像串(共4种组合).每

Vijos1327回文词

回文词 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得到的 结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写 一个程序,求出将给定字符串变成回文词所需插入的最少字符数. 比如字符串"Ab3bd",在插入两个字符后可以变成一个回文词("dAb3bAd"或"Adb3bdA"). 然而,插入两个以下的字符无法使它变成一个回文词. 输入格式: 文件的第一行包含一个整数N,表示给定的字符串的

csuoj 1328: 近似回文词

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 1328: 近似回文词 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 355  Solved: 138 [Submit][Status][Web Board] Description 输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同

csu-1328 近似回文词 和 最长回文字符串

原博文地址:http://blog.csdn.net/u012773338/article/details/39857997 最长回文子串 描述:输入一个字符串,求出其中最长的回文子串.子串的含义是:在原串连续出现的字符 串片段.回文的含义是:正着看和倒着看是相同的,如abba和abbebba.在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首 尾不要输出多余的字符串).输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组). 输入 :每行有一个

UVA 401 Palindromes(回文词)

 回文词 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 401 Appoint description:  acmparand  (2013-07-07)Luke  (2014-01-20) System Crawler  (2015-05-10) Description A regular palindrome is a string of

csu 1328: 近似回文词

1328: 近似回文词 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 394  Solved: 144 [Submit][Status][Web Board] Description 输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把所有字母转化成小写之后得到的串,b(S)是a(S)的逆序串. 比如

字符串 - 近似回文词 --- csu 1328

近似回文词 Problem's Link:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 Mean: 略. analyse: 直接暴力枚举每一个终点,然后枚举回文串的半径即可. Time complexity:O(n*m) Source code: // Memory Time // 1347K 0MS // by : Snarl_jsb // 2014-10-03-14.25 #include<algorithm> #include

UVa401 回文词

Palindromes A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDEDCBA" is a palindrome because it is the same when the string is read from left to right as when the string is

回文词

#include <iostream> #include <stdio.h> #include <iomanip> #include <string> using namespace std; const char *rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";//字符A-9的镜像字符,没有镜像则为空格 const char * msg[] = {"not a palindrome",&

【Vijos 1327】回文词(DP)

题目描述 回文词是一种对称的字符串——也就是说,一个回文词,从左到右读和从右到左读得到的结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写一个程序,求出将给定字符串变成回文词所需插入的最少字符数.   比如字符串“Ab3bd”,在插入两个字符后可以变成一个回文词(“dAb3bAd”或“Adb3bdA”).然而,插入两个以下的字符无法使它变成一个回文词. 输入 第一行包含一个整数N,表示给定字符串的长度,3<=N<=5000   第二行是一个长度为N的字符串,