题解 | #查找兄弟单词#
查找兄弟单词
http://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
查找兄弟单词 C++解法
第一次写题解很紧张,引入算法库本来准备直接使用sort函数排序所有输入项再直接 == 来判断的,直到我摸会去看了看题目,还有第二个输出,没办法,只能使用Hash了。
Hash的再字符串的对比中很好用,本题就可以用很经典的Hash存储字符出现次数,遍历Hash计算总字符数的方法来判断两个字符串包含的字符数量以及种类是否相同(也就是题目定义的兄弟单词)。下面的是代码,代码水品很拉凑合看吧:——(,需要注意的地方添加了一点注释,希望对你有帮助 :————)
#include<iostream>
#include<unordered_map>
#include"stdio.h"
#include<vector>
#include<algorithm>
using namespace std;
int main () {
int n;
vector<string> saveVec;
vector<string> res;
while (cin >> n) {
string s;
for(int i = 0; i < n; i++) {
cin >> s;
saveVec.push_back(s);
}
string x;
cin >> x;
int k;
cin >> k;
unordered_map<char, int> countMap;
unordered_map<char, int> sameMap;
//hash表记录字符出现的次数
for (auto i : x) {
if (countMap[i]) {
countMap[i]++;
} else {
countMap[i] = 1;
}
}
for(auto sa : saveVec) {
//每次遍历使用一个临时Map,使用countMap赋值
sameMap = countMap;
if (sa == x) continue;
int sum = 0;
for (auto a : sa) {
if (sameMap[a]) {
sameMap[a]--;
} else sum += 1; //多出的字符直接计算到sum中
}
for (auto &iter : sameMap) { //遍历计算sum
sum += iter.second;
}
//sum == 0说明两字符串包含完全相同的字符,推入res
if (sum == 0) res.push_back(sa);
}
sort(res.begin(), res.end());
cout << res.size() << endl;
//判断k与res的关系,k大于res的大小则不需要输出
if (k < res.size())
cout << res[k - 1] << endl;
}
return 0;
}