题解 AT2201 【鏡文 / Mirror String】
rui_er
2019-02-13 14:19:31
首先,我们用字符串s1来进行操作,s用来对照。题目说1<=|s|<=10^5,因此数组开大一点。其次,容易想到,|s|是奇数时不可能满足条件,故加上:
```cpp
if(l&1)
{
cout<<"No"<<endl;
return 0;
}
```
其中```&```是```按位与运算```
之后,分两步,如题。
写出下列代码:
```cpp
for(int i=0;i<l;i++) s1[i] = s[l-i-1];
for(int i=0;i<l;i++)
{
if(s1[i] == 'b') s1[i] = 'd';
else if(s1[i] == 'd') s1[i] = 'b';
else if(s1[i] == 'p') s1[i] = 'q';
else s1[i] = 'p';
}
```
综合以上,判断字符串相等,使用```strcmp()```。
综合所有,下为完整代码:
```cpp
#include <iostream>
#include <string.h>
using namespace std;
char s[100010];
char s1[100010];
int main()
{
cin>>s;
int l = strlen(s);
if(l&1)
{
cout<<"No"<<endl;
return 0;
}
for(int i=0;i<l;i++) s1[i] = s[l-i-1];
for(int i=0;i<l;i++)
{
if(s1[i] == 'b') s1[i] = 'd';
else if(s1[i] == 'd') s1[i] = 'b';
else if(s1[i] == 'p') s1[i] = 'q';
else s1[i] = 'p';
}
if(!strcmp(s1, s)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}
```