原题:输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字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 |
样例输入:
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
样例输出:
NOTAPALINDROME -- is not a palindrome.
ISAPALINILAPASI -- is a regular palindrome.
2A3MEAS -- is a mirrored string.
ATOYOTA -- is a mirrored palindrome.
代码如下:
#include <cstring>
#include <cstdio>
#include <cctype>
#define maxn 256
const char mir[]= "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
char mirror(char c){
if(isalpha(c)) return mir[c-'A'];
else return mir[26+c-'1'];
}
int main() {
using namespace std;
FILE * fstream;
int r, m; // 若r为0,则不是回文串; 若m为0,则不是镜像串
r= m= 1;
char ch[maxn];
char c;
fstream= fopen("回文词.txt", "r"); // 从txt文件中读取
while (fgets(ch, maxn, fstream)) { // 读取一组字符串
r= m= 1;
int len= strlen(ch);
ch[len-1]= '\0'; // 去掉末尾的换行符\n
len= strlen(ch);
for (int i= 0; i<len/2+1; i++) {
if((ch[i]!=ch[len-i-1]) && (r==1)) r= 0;
if((ch[i]!=mirror(ch[len-i-1])) && (m==1)) m= 0;
}
if(r==1){
if(m==1)
printf("%s -- is a mirrored palindrome.\n\n", ch); // 回文且镜像
else
printf("%s -- is a regular palindrome.\n\n", ch); // 回文但不镜像
}
else
{
if(m==1)
printf("%s -- is a mirrored string.\n\n", ch); // 不回文但镜像
else
printf("%s -- is not a palindrome.\n\n", ch); // 不回文也不镜像
}
}
return 0;
}