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;
}

你可能感兴趣的:(ACM,uva,401,Palindromes)