题解 | #查找兄弟单词#

查找兄弟单词

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;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务