上海计算机学会2026年2月赛丙组T1误触题解
题目描述
小星好像打错字了。
她有一个想打的字符串 T,但是她可能在某些地方打错了,打错的字符串记为 S。
输入法只能对 S 进行两个相邻的字符交换的操作。
但是她比较懒,她只想最多进行一次操作,多于一次操作她就会放弃。
她的室友小鸡现在想知道,对于给定的 S 和 T,小星能不能把错字改过来?
输入格式
输入数据只有两行 S 和 T,均为一行且仅包含小写字母的字符串。
输出格式
输出一行,如果小星能修改错字,输出 Yes,否则输出 No。
数据范围
对于 100%的数据,字符串长度不超过 100,字符集只包含小写字母。
样例数据
输入:
qwetry
qwerty
输出:
Yes
题解:
-
如果 S 已经等于 T,则不需要交换,也属于“最多一次交换”的情况(0 次交换),答案应为 Yes。
-
如果长度不同,直接不可能,输出 No。
-
如果长度相同但不相等,我们就需要在 S 中找一对相邻字符,交换它们之后是否等于 T。
-
可以遍历 S 中每个位置 i(从 0 到 len-2),交换 S[i] 与 S[i+1],然后比较是否等于 T。
-
如果某一次交换后相等,就输出 Yes,否则 No。
-
-
注意只要有一次交换成功即可。
代码:
#include
#include
#include
using namespace std;
int main() {
string S, T;
cin >> S >> T;
if (S.length() != T.length()) {
cout << "No" << endl;
return 0;
}
if (S == T) {
cout << "Yes" << endl;
return 0;
}
int n = S.length();
for (int i = 0; i < n - 1; i++) {
string copyS = S;
swap(copyS[i], copyS[i + 1]);
if (copyS == T) {
cout << "Yes" << endl;
return 0;
}
}
cout << "No" << endl;
return 0;
}









