// 两个vis数组用于存储字符串a和b中每个字符的出现次数,k用于记录差值 int vis[150], vis2[150], k;
intmain(){ string a, b; cin >> a >> b; // 遍历,统计每个字符的出现次数 for (int i = 0; i < a.length(); i++) { vis[a[i]]++; } for (int i = 0; i < b.length(); i++) { vis2[b[i]]++; }
// 寻找第一个在b中出现而在a中未出现或出现次数少的字符,记录为s2,并计算差值k for (int i = 'a'; i <= 'z'; i++) { if (vis2[i] > vis[i]) { s2 = (char)i; k = vis2[i] - vis[i]; break; } } // 寻找在a中出现次数比b中多k次且在b中未出现的字符,记录为s1 for (int i = 'a'; i <= 'z'; i++) { if (vis[i] - vis2[i] == k && vis2[i] == 0) { s1 = (char)i; break; } }
// 寻找在a中出现但在b中未出现的字符,且该字符不是s1,记录为n1 for (int i = 'a'; i <= 'z'; i++) { if (vis[i] > vis2[i] && vis2[i] == 0 && i != s1) { n1 = (char)i; break; } }
// 根据s1和s2的映射关系以及n1的删除规则,构造新字符串t string t; for (int i = 0; i < a.length(); i++) { if (a[i] == s1)t += s2; // 如果字符是s1,则替换为s2 elseif (a[i] == n1)continue; // 如果字符是n1,则跳过,相当于删除操作 else t += a[i]; // 其他情况,保持字符不变 } // 如果t与b相等,输出s1, s2和n1 if (t == b) { cout << s1 << " " << s2 << endl; cout << n1; return0; } // 如果第一次构造的字符串t不等于b,则尝试从后向前寻找符合条件的s1和n1,并构造新字符串n2 for (int i = 'z'; i >= 'a'; i--) { if (vis[i] - vis2[i] == k && vis2[i] == 0) { s1 = (char)i; break; } }
for (int i = 'z'; i >= 'a'; i--) { if (vis[i] > vis2[i] && vis2[i] == 0 && i != s1) { n1 = (char)i; break; } }