UVA401 - Palindromes(思维)
题目大意:
多组输入,输入一个字符串,判断是不是回文串和镜像串,输出要求:
- 如果该串既不是回文串也不是镜像串 则输出 is not a palindrome.
- 如果该串是回文但不是镜像串 则输出 is a regular palindrome.
- 如果该串不是回文但是是镜像串 则输出 is a mirrored string.
- 如果两个条件都满足 则输出 is a mirrored palindrome.
解题思路:
这道题是紫皮书的入门题,首先我们要打一个镜像表和一个答案表,镜像表用来得到单个字符的镜像字符,答案表则用来判断最后的输出结果。
PS:要注意的是,折半时一定要取到(s.length()+1)/2做一个向上取整,因为如果串长是奇数,中间的字符也要判断一下是不是自己的镜像( 因为这个点WA了3发:( ),再注意一下输出格式 要换两行,AC代码:
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
const char* rev="A 3 HIL JM O 2TUVWXY51SE Z 8 ";//镜像表
const char* ans[]={"is not a palindrome.","is a regular palindrome.","is a mirrored string.","is a mirrored palindrome."};//最后的答案
char jx(char ch)//返回镜像字符
{
if(isalpha(ch))//是字母返回字母镜像
return rev[ch-'A'];
return rev[ch-'0'+25]; //非字母返回数字镜像
}
int main()
{
string s;
while(cin>>s)
{
int flag=1,flag1=1;//flag用于判断回文 flag1判断镜像
for(int i=0;i<(s.length()+1)/2;i++)//一定不能写成s.length() 血淋淋的教训 WA三发
{
if(s[i]!=s[s.length()-i-1])
flag=0;
if(jx(s[i])!=s[s.length()-i-1])
flag1=0;
if(!flag&&!flag1)
break;
}
cout<<s<<" -- "<<ans[flag1*2+flag]<<endl<<endl;//换两行
}
return 0;
}