题意是给你一个字符串,你来判断它是题目给你的哪种字符串。
挫逼死了,开始的时候定了一个标致,从标致向两边递推来判断字符串是否相等。
结果把 len / 2 判断错了:若 len 为奇数(比如 5 ),则 len / 2 = 2,则中心点为 s[ 2 ],即s[ len / 2],向两边推。
若 len 为偶数(比如 6 ),则 len / 2 = 3,则对称点为 s[ 3 ],即s[len / 2],与s[len / 2 + 1] 对称,然后向两边推。
后来我发现这种做法真心挫爆了。
比较范例的做法:
用 len / 2 来限制左边移动的指针长度,用len - i - 1 来和 i ,对称。
bool is_regular()
{
int len = strlen(s);
for (int i = 0; i < len / 2; i++)
{
if (s[i] != s[len - i - 1])
return false;
}
return true;
}
这是本题的第一个注意点。
第二个注意点是第二种判断时,若只有一个字符,需要判断这个字符是否在镜子字符里,在的话是镜子回文,不在是一般回文。
第二种判断实现的时候,基本思路是,一个遍历找到镜子字符,然后再判断。开始的时候逻辑搞错了,所以一直错。
代码:
#include<stdio.h>
#include<string.h>
char s[10000];
bool is_regular()
{
int len = strlen(s);
for (int i = 0; i < len / 2; i++)
{
if (s[i] != s[len - i - 1])
return false;
}
return true;
}
bool is_mirrored()
{
char m1[] = {"AEHIJLMOSTUVWXYZ12358"};
char m2[] = {"A3HILJMO2TUVWXY51SEZ8"};
int len = strlen(s);
int i;
if (len == 1)
{
for (i = 0; i < 21; i++)
{
if (s[0] == m1[i])
break;
}
if (i == 21 || s[0] != m2[i])
return false;
}
else
{
int j;
for(j = 0; j < len / 2; j++)
{
for (i = 0; i < 21; i++)
{
if (s[j] == m1[i])
break;
}
if (i == 21 || s[len - j - 1] != m2[i])
return false;
}
}
return true;
}
int main()
{
while (scanf("%s", s) != EOF)
{
if (is_regular())
{
if (is_mirrored())
{
printf("%s -- is a mirrored palindrome.\n\n", s);
}
else
{
printf("%s -- is a regular palindrome.\n\n", s);
}
}
else
{
if (is_mirrored())
printf("%s -- is a mirrored string.\n\n", s);
else
printf("%s -- is not a palindrome.\n\n", s);
}
}
return 0;
}