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

“回文串”是一个正读和反读都一样的字符串,字符串由数字和大写字母组成,比如“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  阅读(395)  评论(0)    收藏  举报