题目大意:
给出两个字符串A,B,问B串是否能通过最多一次操作变成A.
定义一次操作为:交换相邻两个字符。
思路:
首先我们求出有多少位与A串不同,记作cnt。
- 如果cnt==0,显然A,B两个串相同,Yes
- 如果cnt>2,说明无论怎么操作,A,B两个串都至少会有一位不相同
- 如果cnt==2,考虑找到第一位与A串不相同的字符,分别与前后交换,判断是否能变成A即可。(对于一次操作一定是相邻的,那只用判断就可以了,如果不行,显然两个不同字符的位置不相邻,无法操作)。
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
int len, cnt;
string a, b, d;
char c;
int main()
{
cin >> a >> b;
len = a.length();
for(int i = 0; i < len; i++) if(a[i] != b[i]) cnt++;
if(cnt == 0) {printf("Yes\n"); return 0;}
if(cnt > 2 || cnt == 1) printf("No\n");
else
{
for(int i = 0; i < len; i++)
{
if(b[i] != a[i])
{
d = b;
c = d[i];
d[i] = d[i - 1];
d[i - 1] = c;
if(d == a) {printf("Yes\n"); return 0;}
d = b;
c = d[i];
d[i] = d[i + 1];
d[i + 1] = c;
if(d == a) {printf("Yes\n"); return 0;}
printf("No\n");
return 0;
}
}
}
return 0;
}