• UVA 401 回文词 Palindromes


    回文词 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    输入的每行包含一个字符串(保证只有上述字符,不含空白字符),判断它是否为回文串和镜像串(共4种组合)。

    题目描述

    PDF

    输入格式

    输出格式

    样例 #1

    样例输入 #1

    NOTAPALINDROME
    ISAPALINILAPASI
    2A3MEAS
    ATOYOTA
    
    • 1
    • 2
    • 3
    • 4

    样例输出 #1

    NOTAPALINDROME -- is not a palindrome.
    ISAPALINILAPASI -- is a regular palindrome.
    2A3MEAS -- is a mirrored string.
    ATOYOTA -- is a mirrored palindrome.
    
    • 1
    • 2
    • 3
    • 4

    提要:

    这翻译每个合法字符的镜像时有问题吧。
    当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];//返回镜像字符
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意,返回镜像字符时要把字母和数字区分开,因为在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];//返回镜像字符
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    主函数的话直接看总代码就能理解~~

    代码:

    #include
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    结束啦~~~

    求赞

  • 相关阅读:
    【流行框架】Spring
    硬核java hook(直接改jdk)
    Linux---编辑器vim的认识与简单配置
    linux同步之原子操作(一)
    KMP超高效匹配算法
    MFC 控制台打印,弹出对话框
    事件循环-同步异步-计时器精确问题
    VMware下linux中ping报错unknown host的解决办法
    数值法求解微分博弈问题(〇)——定义
    GBase 8a常用命令
  • 原文地址:https://blog.csdn.net/m0_66603329/article/details/126453068