-
CodeForces 1027A-Palindromic Twist
-
题目链接:
A. Palindromic Twist
-
思路:
题目大意:
给定一个长度为n的字符串,规定每个字符可以转变为相邻字符 ,比如 c->b,c->d,当然z只能变成y,a只能变成b,要求字符串中每个字符都必须转变一次,能否变成回文字符串(左右读都一样)
题解:
很高兴 a z不能互转,不然还需分开讨论
折半对称问题,其实就是问每个字符和对称面字符(i 与 n-i-1)改变一次后能不能相等
a.两个字符的ASCII码差距大于2,显然这种情况下不可能改变后相等
b.差距为2(中间隔着一个字符),两个字符都变成它们中间那个字符
c.差距为一(相邻),两个字符都要改变,不可能
d.两个字符相等,转成相同的就可以
-
代码:
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
#define MAX_SIZE 105
char Str[MAX_SIZE];
int main()
{
int T,n;
cin>>T;
while(T--)
{
int flag=0;
cin>>n;
cin>>Str;
for(int i=0;i<n/2;i++)
{
if(abs(Str[i]-Str[n-i-1])==2||abs(Str[i]-Str[n-i-1])==0)
continue;
else
{
flag=1;
break;
}
}
if(flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}