一、核心思想
本题难度较低,但是在代码上(紫书的思路)有突出的优点,所以本题比较经典和重要。技巧比如其将镜像串进行了打表操作,以及将返回的信息也打了表。(注意这个表最好打成常量的)。代码是紫书上的,本文写了一些注释。
二、代码及注释
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<ctype.h>
using namespace std;
const int maxn=25;
const char* rev="A 3 HIL JM O 2TUVWXY51SE Z 8 ";//这里的空格一定不能乱敲,注意空格数目
const char* msg[]={"is not a palindrome.","is a regular palindrome.","is a mirrored string.","is a mirrored palindrome."};
char r(char ch){ //向这样的操作很有必要,像这样的转化功能的情况,最好还是专门写一个转换函数出来
if(isalpha(ch)) return rev[ch-'A']; //这样就能方便对应数组rev的情况
else return rev[ch-'0'+25];
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
char s[30];
while(scanf("%s",s)==1){ //多组数据的输入
int len=strlen(s);
int p=1,m=1; //其标记作用
for(int i=0;i<(len+1)/2;i++){ //针对回文串还有相似的问题时候,都是这个循环方式
if(s[i]!=s[len-1-i]) p=0; //判断出这个不是回文串
if(r(s[i])!=s[len-1-i]) m=0; //判断镜像串
}
printf("%s -- %s\n\n",s,msg[m*2+p]); //这个m*2+p是个很好的思想
}
return 0;
}
三、作者
Bowen
作者水平有限,如有纰漏之处,敬请斧正。
欢迎大家一起学习交流