题解 | #查找兄弟单词#
查找兄弟单词
http://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
哈希表
统计字符出现的次数,然后一一匹配,代码一般,时间复杂度有点大,注释都在代码里了,能看懂应该不是问题
#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;
void func(string inp, vector<string> inps, int k){
unordered_map<char, int> hash0, temp;
int n = inp.size();
vector<string> ans;
for(auto ch:inp)hash0[ch]++;//统计需要查找的字符串的字符出现频率
for(auto bro:inps){ //下面开始查找
if(bro.size() == n){ //如果兄弟字符串的长度一定相等,这一步可以排除大多数别的字符串
if(bro != inp){ //而且兄弟字符串一定不相同,相同的话就排除
for(auto ch:bro)temp[ch]++; //统计这个字符串的字符出现频率
if(temp == hash0)ans.emplace_back(bro);//如果出现字符频率一样,就放到ans中
temp.clear(); //无论字符出现频率是否相同,都要将这个临时存储的变量清除
}
}
}
cout<<ans.size()<<endl; //循环结束, ans的长度就是答案
if(k <= ans.size()){
sort(ans.begin(), ans.end()); // 然后按照字典序排序
cout<<ans[k-1]<<endl;
}
}
int main(){
string inp;
vector<string> inps;
int n,k;
cin>>n;//输入n个数字
while(n--){
cin>>inp;
inps.emplace_back(inp);//依次放入容器中
}
cin>>inp;//最后再输入需要查找的字符串
cin>>k;//输入查找的k数字
func(inp, inps, k);
return 0;
}