【算法】Palindromes

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<string.h>
#include<set>
using namespace std;

set<char> all;  // 存放镜像mirror中的特殊对称字符 
set<char> a;  // 存放镜像mirror中不存在的字符 

bool mirror(char s[])  // 判断是否对称 
{
	char ss[25];
	// E-3 J-L S-2 Z-5
    all.insert('E');all.insert('3');all.insert('J');all.insert('L');
	all.insert('S');all.insert('2');all.insert('Z');all.insert('5');
	// B C D F G K N P Q R 4 6 7 9
	a.insert('B');a.insert('C');a.insert('D');a.insert('F');a.insert('G');a.insert('K');a.insert('N');
	a.insert('P');a.insert('Q');a.insert('R');a.insert('4');a.insert('6');a.insert('7');a.insert('9');
	for(int i=0;s[i]!='\0';i++){
		if(a.find(s[i])!=a.end())  // 若存在非法字符,则false 
		    return false;
	}
	for(int i=0;i<=strlen(s)/2;i++){ // 由所提供字符串的前半部分构造对称字符串 
		if(i==strlen(s)/2){ //为奇数字符串的中间字符赋值 
			ss[i] = s[i]; 
			break;
		}
		if(all.find(s[i])==all.end()){ 
		    ss[i] = s[i];
			ss[strlen(s)-1-i] = s[i];	
		}
		else{
			switch(s[i]){
				case 'E': ss[i]=s[i]; ss[strlen(s)-1-i]='3';break;
				case '3': ss[i]=s[i]; ss[strlen(s)-1-i]='E';break;
				case 'J': ss[i]=s[i]; ss[strlen(s)-1-i]='L';break;
				case 'L': ss[i]=s[i]; ss[strlen(s)-1-i]='J';break;
				case 'S': ss[i]=s[i]; ss[strlen(s)-1-i]='2';break;
				case '2': ss[i]=s[i]; ss[strlen(s)-1-i]='S';break;
				case 'Z': ss[i]=s[i]; ss[strlen(s)-1-i]='5';break;
				case '5': ss[i]=s[i]; ss[strlen(s)-1-i]='Z';break;
			}
		}   
	}
	ss[strlen(s)]='\0';
	if(strcmp(s,ss)==0)  // 判断两个字符串是否相同 
	    return true;
	else return false;
}

bool palindrome(char s[]) // 判断正逆序读是否相同 
{
	for(int i=0;i<strlen(s)/2;i++){
		if(s[i]!=s[strlen(s)-1-i]) return false;
	}
	return true;
}

int main()
{
	char str[25];
	while(cin>>str){  // ctrl+z结束程序 
		bool mir,pal;
		mir = mirror(str); // 判断镜像对称 
		pal = palindrome(str); // 判断正序逆序相同 
		if(mir&&pal)  
			cout<<str<<" -- is a mirrored palindrome."<<endl<<endl;
		else if(mir)
			cout<<str<<" -- is a mirrored string."<<endl<<endl;
		else if(pal)
		    cout<<str<<" -- is a regular palindrome."<<endl<<endl;
		else
		    cout<<str<<" -- is not a palindrome."<<endl<<endl; 
	}
 	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值