UVa 401 Palindromes 字符串基础

题目链接:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=19520
题目大意:给你一个字符串,一要你判断是否是回文串;二要把这个字符串的每一个字符按照给定的规则翻转,而然后判断翻转后的字符串是否是原串的逆序。
思路不难,但是有些地方要注意。首先要注意的一个问题是,大写字母O和数字0是一样的。这一点我觉得题目的表述不妥,按照我对题目的理解,数字0是无效的,应该是不会出现的,但是结果跟我的理解不一样。然后就是如果串中含有不能翻转的字母,那么是不能成为mirrored string的,我把不能翻转的字母的翻转字母记为-1。
具体代码:

#include<stdio.h>
#include<ctype.h>
#include<string.h>
char reverseNum[]={'0','1','S','E',-1,'Z',-1,-1,'8',-1};
char reverseLetter[]={'A',-1,-1,-1,'3',-1,-1,'H','I','L',-1,'J','M',-1,'O',-1,-1,-1,'2','T','U','V','W','X','Y','5'};
bool isPalindrome(char *str)
{
int i,len=strlen(str);
for(i=0;i<len/2;i++)
{
if(str[i]=='0'&&str[len-i-1]=='O'||str[i]=='O'&&str[len-i-1]=='0') continue;
if(str[i]!=str[len-i-1]) break;
}
if(i<len/2) return 0;
else return 1;
}
bool isMirrored(char *str)
{
int i,len=strlen(str);
for(i=0;i<(len+1)/2;i++)
if(isalpha(str[i]))
{
if(str[i]=='O'&&str[len-i-1]=='0') continue;
if(reverseLetter[str[i]-'A']==-1||reverseLetter[str[i]-'A']!=str[len-i-1])
break;
}
else
{
if(str[i]=='0'&&str[len-i-1]=='O') continue;
if(reverseNum[str[i]-'0']==-1||reverseNum[str[i]-'0']!=str[len-i-1])
break;
}
if(i<(len+1)/2) return 0;
else return 1;
}
int main()
{
int p,m;
char str[2000];
while(gets(str))
{
p=m=0;
if(isPalindrome(str))
p=1;
if(isMirrored(str))
m=1;
if(p&&m)
printf("%s -- is a mirrored palindrome.\n\n",str);
else if(p)
printf("%s -- is a regular palindrome.\n\n",str);
else if(m)
printf("%s -- is a mirrored string.\n\n",str);
else
printf("%s -- is not a palindrome.\n\n",str);
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值