镜像回文串(两种算法的实现)

“回文串”是一个正读和反读都一样的字符串,字符串由数字和大写字母组成,比如“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));
}

}

代码量的差别还是很大

posted @ 2021-01-31 19:46  empty_thought  阅读(421)  评论(0)    收藏  举报