镜像回文串(两种算法的实现)
“回文串”是一个正读和反读都一样的字符串,字符串由数字和大写字母组成,比如“level”或者“abcdcba”等等就是回文串。
“镜像串”是左右镜像之后与原串相同,如2S和3AIAE,但是,并不是每个字符在镜像之后都能得到一个合法字符,本题中每个字符的镜像如下图所示。

输入
输入包含多组测试用例。
对于每组测试用例,只包含上述表格中的字符,不含空白字符串。长度不超过50.
输出
对于每组测试用例,输出其是否为回文串和镜像串。输出见样例所示。
每组测试用例之间都有一个空行。
样例输入 Copy
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
样例输出 Copy
NOTAPALINDROME -- is not a palindrome.
ISAPALINILAPASI -- is a regular palindrome.
2A3MEAS -- is a mirrored string.
ATOYOTA -- is a mirrored palindrome.
这道题很多种情况看似没有规律,要一个个分类讨论,其实镜像字符可以按26个字母和数字组成一个新字符串,判断是数字还是字母,然后只需自己去找位置
方法1
include <stdio.h>
#include <string.h>
int head,leap;
int judge_mirror_huiwen(char a,char b)
{
if(a=='A'&&b=='A') return 0;
if(a=='H'&&b=='H') return 0;
if(a=='I'&&b=='I') return 0;
if(a=='M'&&b=='M') return 0;
if(a=='O'&&b=='O') return 0;
if(a=='T'&&b=='T') return 0;
if(a=='U'&&b=='U') return 0;
if(a=='V'&&b=='V') return 0;
if(a=='W'&&b=='W') return 0;
if(a=='X'&&b=='X') return 0;
if(a=='Y'&&b=='Y') return 0;
if(a=='1'&&b=='1') return 0;
if(a=='8'&&b=='8') return 0;
return 1;
}
int judge_mirror(char a,char b)
{
if(a=='A'&&b=='A') return 0;
if(a=='E'&&b=='3') return 0;
if(a=='H'&&b=='H') return 0;
if(a=='I'&&b=='I') return 0;
if(a=='J'&&b=='L') return 0;
if(a=='L'&&b=='J') return 0;
if(a=='M'&&b=='M') return 0;
if(a=='O'&&b=='O') return 0;
if(a=='S'&&b=='2') return 0;
if(a=='T'&&b=='T') return 0;
if(a=='U'&&b=='U') return 0;
if(a=='V'&&b=='V') return 0;
if(a=='W'&&b=='W') return 0;
if(a=='X'&&b=='X') return 0;
if(a=='Y'&&b=='Y') return 0;
if(a=='Z'&&b=='5') return 0;
if(a=='1'&&b=='1') return 0;
if(a=='2'&&b=='S') return 0;
if(a=='3'&&b=='E') return 0;
if(a=='5'&&b=='Z') return 0;
if(a=='8'&&b=='8') return 0;
if(a=='2'&&b=='3') return 0;
return 1;
}
int if_mirror_huiwen(char str[],int len)
{
head=0,leap=len-1;
for(int i=0;i<len;i++)
{
if(head<leap)
{
if(judge_mirror_huiwen(str[head],str[leap]))
return 0;
}
head++;leap--;
}
return 1;
}
int if_mirror(char str[],int len)
{
head=0,leap=len-1;
for(int i=0;i<len;i++)
{
if(head<leap)
{
if(judge_mirror(str[head],str[leap]))
return 0;
}
head++;leap--;
}
return 1;
}
int if_huiwen(char str[],int len)
{
head=0,leap=len-1;
for(int i=0;i<len;i++)
{
if(head<leap)
{
if(str[head]!=str[leap]) return 0;
}
head++;leap--;
}
return 1;
}
void print_string(char str[],int len)
{
for(int i=0;i<len;i++)
printf("%c",str[i]);
}
int main()
{
char str[51];
while((scanf("%s",str))!=EOF)
{
int len;
len=strlen(str);
if(if_mirror_huiwen(str,len))
{
print_string(str,len);
printf(" -- is a mirrored palindrome.\n");
printf("\n");
}
else if(if_mirror(str,len))
{
print_string(str,len);
printf(" -- is a mirrored string.\n");printf("\n");
}
else if(if_huiwen(str,len))
{
print_string(str,len);
printf(" -- is a regular palindrome.\n");printf("\n");
}
else
{
print_string(str,len);
printf(" -- is not a palindrome.\n");printf("\n");
}
}
}
方法2
include <stdio.h>
#include <string.h>
#include <ctype.h>
//isdigit isalpha 针对字符型
char* str="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
char* mer[100]={"is not a palindrome","is a regular palindrome","is a mirrored string","is a morroried palindrome"};
char deal(char* input,int i)
{
if(isalpha(input[i])) return *(str+input[i]-'A');
else return *(str+input[i]-'0'+25);
}
int main()
{
char input[100];
while(scanf("%s",input)!=EOF)
{
int m=1,n=1;
int len=strlen(input);
for(int i=0;i<len/2;i++)
{
if(deal(input,i)!=input[len-i-1]) m=0;
if(input[i]!=input[len-i-1]) n=0;
}
if(m&n) puts(*(mer+3)) ;
if(!m&&n) puts(*(mer+1));
if(m&!n) puts(*(mer+2));
if(!m&&!n) puts(*(mer));
}
}
代码量的差别还是很大

浙公网安备 33010602011771号