AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 1. Elementary Problem Solving :: String
Description
给一段字符串,判断是否为回文串或者镜像串。
Type
String
Analysis
定义两个指针,一个从前往后,一个从后往前。
对两个指针指向的字符进行匹配即可。
对于题目给的匹配表,定义个字符常量数组来map即可。
注意镜像串的中间唯一字符,自身必须是个镜像字符。
Solution
// UVaOJ 401
// Palindromes
// by A Code Rabbit
#include <cstdio>
#include <cstring>
const char LETTER_REVERSE[] = {
'A', ' ', ' ', ' ', '3', ' ', ' ',
'H', 'I', 'L', ' ', 'J', 'M', ' ',
'O', ' ', ' ', ' ', '2', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z'
};
const char NUMBER_REVERSE[] = {
' ', '1', 'S', 'E', ' ', 'Z', ' ', ' ', '8', ' '
};
char str[100];
int main() {
while (gets(str)) {
bool palindrome = true;
bool mirrored = true;
for (int i = 0, j = strlen(str) - 1; i <= j; i++, j--) {
if (str[i] != str[j])
palindrome = false;
if ('A' <= str[i] && str[i] <= 'Z') {
if (LETTER_REVERSE[str[i] - 'A'] != str[j])
mirrored = false;
} else {
if (NUMBER_REVERSE[str[i] - '0'] != str[j])
mirrored = false;
}
}
printf("%s -- ", str);
if (palindrome && mirrored)
printf("is a mirrored palindrome.\n");
else if (palindrome && !mirrored)
printf("is a regular palindrome.\n");
else if (!palindrome && mirrored)
printf("is a mirrored string.\n");
else
printf("is not a palindrome.\n");
printf("\n");
}
return 0;
}