输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0。所谓回文串,即反转后和原串相同,如abba和madam。所谓镜像串是指左右镜像后原串相同,如 2S 和 3AIAE. 注意,并不是所有的字符在镜像之后都会得到一个合法字符。每个字符的镜像如下图所示:
Character | Reverse | Character | Reverse | Character | Reverse |
A | A | M | M | Y | Y |
B | N | Z | 5 | ||
C | O | O | 1 | 1 | |
D | P | 2 | S | ||
E | 3 | Q | 3 | E | |
F | R | 4 | |||
G | S | 2 | 5 | Z | |
H | H | T | T | 6 | |
I | I | U | U | 7 | |
J | L | V | V | 8 | 8 |
K | W | W | 9 | ||
L | J | X | X |
输入的每行包括一个字符串(保证只有上述字符。不含空白字符),判断它是否为回文串和镜像串(共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.
首先我们可以将所有的镜像字符用一个char型的指针来表示,方便之后的调用,同时将输出的对应结果用字符串数组来表示,接下来再开始具体的编程。
#include <iostream>
#include <string.h>
using namespace std;
const char * a = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char * b[] = {"not a palindrome","a regular palindrome","a mirrored string","a mirrored palindrome"};
const int N = 100;
char choice(char ch)
{
if(isalpha(ch)) //判断是否为字符,若为字符则减去A的数值,就可以在数组a中找到对应的字符
return a[ch - 'A'];
return a [ch - '0' + 25]; //不为字符则减去数字0的数值,同时加上25,此处不是26,因为数组从0开始
}
int main()
{
int flag1 = 1;
int flag2 = 1;
char c[N];
while((cin>>c))
{
int len = strlen(c);
for(int i=0;i<len/2+1;i++)
{
if(c[i]!=c[len-1-i])
flag1=0;
if(choice(c[i])!=c[len-1-i])
flag2=0;
}
cout<<c<<" -- is "<<b[flag2*2+flag1]<<"."<<endl;
}
return 0;
}