简单字符串-UVa401回文词(紫书题分析)

一、核心思想

本题难度较低,但是在代码上(紫书的思路)有突出的优点,所以本题比较经典和重要。技巧比如其将镜像串进行了打表操作,以及将返回的信息也打了表。(注意这个表最好打成常量的)。代码是紫书上的,本文写了一些注释。

二、代码及注释

#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
作者水平有限,如有纰漏之处,敬请斧正。
欢迎大家一起学习交流

发布了50 篇原创文章 · 获赞 7 · 访问量 1148

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103248681