题解 | 查找兄弟单词
查找兄弟单词
https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 判断两个字符串是否是兄弟单词
bool IsBrother(const string& compare, const string& base) {
if (compare.length() != base.length())
return false; // 长度不同,直接返回 false
if (compare == base)
return false; // 完全相同,不是兄弟单词
// 统计 compare 和 base 中每个字符的出现次数
vector<int> compareCount(26, 0);
vector<int> baseCount(26, 0);
for (char ch : compare) compareCount[ch - 'a']++;
for (char ch : base) baseCount[ch - 'a']++;
// 如果字符统计结果相同,则是兄弟单词
return compareCount == baseCount;
}
int main() {
int n;
cin >> n;
vector<string> words(n);
for (int i = 0; i < n; i++) {
cin >> words[i];
}
string x;
cin >> x;
int k;
cin >> k;
// 统计兄弟单词
vector<string> brothers;
for (const string& word : words) {
if (IsBrother(word, x)) {
brothers.push_back(word);
}
}
// 输出兄弟单词的数量
cout << brothers.size() << endl;
// 如果存在兄弟单词且 k 有效,输出第 k 个兄弟单词
if (!brothers.empty() && k <= brothers.size()) {
sort(brothers.begin(), brothers.end()); // 按字典序排序
cout << brothers[k - 1] << endl;
}
return 0;
}
这道题给我看得有点懵,题干说的是交换任意两个字母的位置,但给的示例1给人的感觉是可以交换很多次,也就意味着三个不同的字母排列组合的方式有6种,所以才会有5个兄弟单词,那就只好计算每个字母出现的次数洛。
