Palindromes HDU - 1318(疯狂字符串)

正回文是一个数字或字母串,其前后方向相同。例如,字符串“abcdedcba”是回文,因为从左到右读取字符串与从右到左读取字符串时相同。              

镜像字符串是一个字符串,当字符串的每个元素都更改为其反向(如果它有反向)并且向后读取字符串时,结果与原始字符串相同。例如,字符串“3a i e”是镜像字符串,因为“a”和“i”是它们各自的反转,而“3”和“e”是彼此的反转。              

镜像回文是满足常规回文和镜像字符串条件的字符串。字符串“atoyota”是一个镜像回文,因为如果向后读取字符串,则该字符串与原始字符串相同,并且因为如果每个字符都被其反向替换,并且结果向后读取,则结果与原始字符串相同。当然,“A”、“T”、“O”和“Y”都是它们自己的反面。              

所有有效字符及其背面的列表如下。 

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

请注意,O(零)和0(字母)被认为是同一个字符,因此只有字母“0”是有效字符。 

输入              

输入由字符串组成(每行一个),每个字符串由一到二十个有效字符组成。任何字符串中都不会有无效字符。你的程序应该读到文件的末尾。              

产量              

对于每个输入字符串,您应该打印从第1列开始的字符串,紧接着是以下字符串之一。            

 “--不是回文。”              如果字符串不是回文并且不是镜像字符串              

“——是一个规则的回文。”              如果字符串是回文且不是镜像字符串            

 “--是镜像字符串。”              如果字符串不是回文并且是镜像字符串              

“--是镜像回文。”              如果字符串是回文并且是镜像字符串              

请注意,输出行要包括上表所示的和下面的示例输出中演示的-'和间距。            

 此外,在每个输出行之后,必须打印一个空行。

Sample Input

NOTAPALINDROME 
ISAPALINILAPASI 
2A3MEAS 
ATOYOTA

Sample Output

NOTAPALINDROME -- is not a palindrome.

ISAPALINILAPASI -- is a regular palindrome.

2A3MEAS -- is a mirrored string.

ATOYOTA -- is a mirrored palindrome.

回文串和镜像串,都是一个原理,正着读和反着读,都是一样的,一开始我用了reverse 函数来判断,但是镜像就不好实现判断。大神思路就是从前和后扫一遍,一个一个判断。设置两个标记回文标记和镜像标记来实现判断。

代码:
 

#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdio.h>

#include<string>
#include<string.h>

typedef long long ll;
using namespace std;

char a[]="A   3  HIL JM O   2TUVWXY5";
char b[]="1SE Z  8 ";
char mp[][100]={" -- is not a palindrome."
                , " -- is a regular palindrome."
			    , " -- is a mirrored string." 
				, " -- is a mirrored palindrome."};



char zhuanhua(char c)
{
	if(isalpha(c))
		return a[c-'A'];
	else
		return b[c-'1'];
}
int main()
{
	string s;
	while(cin>>s)
	{
		int huiwen=1;
		int jingzi=1;
		int start=0;
		int end=s.length()-1;
		while(start<=end)
		{
			if(s[start]!=s[end])
				huiwen=0;
			if(zhuanhua(s[start])!=s[end])
				jingzi=0;
			start++;
			end--;
		}	
		cout<<s<<mp[jingzi*2+huiwen]<<endl;
		cout<<endl;
	}
	return 0;
}

找对应的镜像字符时,巧妙地设置两个字符数组,一 一对应关系,a中下标代表A B C D E ..... ,数组数据是对应的镜像字符。

字母镜像和数组镜像应该分开判断,用了字符函数 isalpha( ),判断是字符还是数字。

char a[]="A   3  HIL JM O   2TUVWXY5";
char b[]="1SE Z  8 ";

判断完后,两个标记就可以判断输出。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值