回文词 Palindromes
题面翻译
输入是一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字 0 0 0 。所谓回文串,就是反转以后和原串相同,如 a b b a abba abba 和 m a d a m madam madam 。所谓镜像串,就是左右镜像之后和原串相同,如 2 S 2S 2S 和 3 A I A E 3AIAE 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
输入的每行包含一个字符串(保证只有上述字符,不含空白字符),判断它是否为回文串和镜像串(共4种组合)。
题目描述
输入格式
输出格式
样例 #1
样例输入 #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.
提要:
这翻译每个合法字符的镜像时有问题吧。
当Character为3时,它应该是有对应的Reverse E的啊。
分析:
很简单,就是上面那个坑折磨了我很久。
我们先const char* J="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
把所有字母的镜像存进去(空格表示该字母的镜像与它本身相等)
再const char* D[]={"is not a palindrome.","is a regular palindrome.","is a mirrored string.","is a mirrored palindrome."};
把每一种的回答情况存进去。
怎么求一个字符的镜像字符呢???
用一个函数就行啦~~~
我们自定义一个char类型的aa函数(函数我都喜欢用两个相同的字母作为名称):
char aa(char ch)//要求镜像字符的字符
{
if(isalpha(ch))//如果它是字母
{
return J[ch-'A'];//返回镜像字符
}
else//是数字
{
return J[ch-'0'+25];//返回镜像字符
}
}
注意,返回镜像字符时要把字母和数字区分开,因为在ascll码里,大写字母与数字之间是有一段距离的。而判断字符是否是字母时,我们可以直接用isslpha()
函数,如果不会用,aa函数也可以这样写:
char aa(char ch)//要求镜像字符的字符
{
if(ch>='A'&&ch<='Z')//如果它是字母
{
return J[ch-'A'];//返回镜像字符
}
if(ch>='0'&&ch<='9')//是数字
{
return J[ch-'0'+25];//返回镜像字符
}
}
主函数的话直接看总代码就能理解~~
代码:
#include<bits/stdc++.h>
using namespace std;
const char* J="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char* D[]={"is not a palindrome.","is a regular palindrome.","is a mirrored string.","is a mirrored palindrome."};
char aa(char ch)
{
if(isalpha(ch))
{
return J[ch-'A'];
}
else
{
return J[ch-'0'+25];
}
}
char s[1000];//上面就不多说咯~~
int main()
{
while(scanf("%s",s)==1)
{
int len=strlen(s);
bool M=1,P=1;//M表示判断镜像串,P表示判断回文串
for(int i=0;i<(len+1)/2;i++)//只枚举字符串的前一半就能判断出来啦
{
if(s[i]!=s[len-i-1])//如果当前的字符与它相对的回文字符不相等
{
P=0;//不是回文串
}
if(aa(s[i])!=s[len-i-1])//如果当前的字符相对的字符不是其的镜像字符
{
M=0;//不是镜像串
}
}
printf("%s -- %s\n\n",s,D[2*M+P]);//按要求输出
}
return 0;
}
结束啦~~~
求赞