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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值