题目链接:Palindromes
题目描述
输入输出
思路
字符串可以看成优先级从下到上,即下层可变为上层,但上层不能变为下层
1.先设置标志初始为镜像回文
2.先遍历检查一遍有无非镜像字符,如果有将标志设置为回文,因为不可能出现镜像
3.当标志为回文时,只用判断是否为回文,若存在前后不匹配的即标志设置为不是回文,记得一定要break
4.当标志是回文时,前后比较,当不相等时判断是否为镜像,如果不是则设置为不是回文
#include<stdio.h>
#include<string.h>
int main()
{
char str[25];
char str1[100]={"EJLSZ235"};//镜像判断
char str2[100]={"3LJ25SEZ"};//上下对应
char str3[100]={"BCDFGKNPQR4679"};//非镜像字符
char str4[4][100]={" -- is not a palindrome.",
" -- is a regular palindrome.",
" -- is a mirrored string.",
" -- is a mirrored palindrome."};
while(~scanf("%s",str)){
int i,j,k,len,flag=3;
len=strlen(str);
for(i=0,j=len-1;i<(len+1)/2;i++,j--){//判断非镜像字符
for(k=0;k<strlen(str3);k++){
if(str[i]==str3[k]){
flag=1;
break;
}
}
if(flag==1) break;
}
for(i=0,j=len-1;i<(len+1)/2;i++,j--){
if(flag==1){//判断回文
if(str[i]!=str[j]){
flag=0;
break;
}
}else{
if(str[i]!=str[j]){//判断镜像
for(k=0;k<strlen(str1);k++){
if(str[i]==str1[k]&&str[j]==str2[k]){
flag=2;
break;
}
}
if(k==strlen(str1)){
flag=0;
break;
}
}else{
for(k=0;k<strlen(str1);k++){//判断镜像回文
if(str[i]==str1[k]){
flag=1;
break;
}
}
}
}
}
printf("%s%s\n\n",str,str4[flag]);
}
return 0;
}
WA几次,就是判断条件彻底完成后没有进行break;