这么简洁的算法我没有想到。这个题目算法如此简洁的原因在于常量数组m(存放镜像元素)的应用和镜像字符转化函数的定义、使用。
程序中有好几个注意点,我会在代码中提及。
#include <bits/stdc++.h>
using namespace std;
const char *m="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char *pf[]={"not a palindrome.","a regular palindrome.","a mirrored string.","a mirrored palindrome."};
char ex(char c) {
if (isalpha(c)) return m[c-'A'];
else return m[c-'0'+25]; //注意是c-'0'+25,而不是c+25,因为c是个char型
}
int main() {
char s[1005];
while (scanf("%s",s)==1) {
int pali=1,mirr=1;
int len=strlen(s);
for (int i=0;i<(len+1)/2;i++) { //i=0;i<(len+1)/2,这个设定恰好可以遍历到前面的所有元素,记住了,不要每次做类似的题都再算一遍
if (s[i]!=s[len-1-i]) pali=0; //下标(len-i-1)恰好为下标i在数列中的对称元素,记住了
if (ex(s[i])!=s[len-1-i]) mirr=0;
}
printf("%s -- is %s\n\n",s,pf[pali+2*mirr]); //列一个解的方阵即可知,这样计算的结果恰好对应于p[]集合中的答案字符串,这个构造极其巧妙
}
return 0;
}