UVA 401 回文词 Palindromes

46 篇文章 1 订阅

回文词 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种组合)。

题目描述

PDF

输入格式

输出格式

样例 #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;
}

结束啦~~~

求赞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

harmis_yz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值