华为机试HJ27:查找兄弟单词

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ27:查找兄弟单词相关的知识,希望对你有一定的参考价值。

题目描述:

定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。

兄弟单词要求和原来的单词不同。例如:ab和ba是兄弟单词。ab和ab则不是兄弟单词。

现在给定你n个单词,另外再给你一个单词str,让你寻找str的兄弟单词里,按字典序排列后的第k个单词是什么?

注意:字典中可能有重复单词。本题含有多组输入数据。

输入描述:

先输入单词的个数n,再输入n个单词。 再输入一个单词,为待查找的单词x 最后输入数字k

输出描述:

输出查找到x的兄弟单词的个数m 然后输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。

示例:

输入:3 abc bca cab abc 1

输出:2 bca

解题思路:

首先,输入一个数字表示接下来要输入N个单词,存储这N个单词到vector中,再输入要对比的单词t,以及所要输出的单词序号idx;遍历所有单词,首先排除尺寸不一的和完全一样的,再对比剩下的单词,用两个map分别存储某单词和对比单词t的所有字符出现的次数,进行比对,若所有字符出现次数均完全一致,则说明该单词是兄弟单词,存储在result中;用sort函数对result排序,并输出结果。

测试代码:

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int main()
{
    int number;
    cin>>number;
    vector<string> in;
    while(number--)
    {
        string s;
        cin>>s;
        in.push_back(s);
    }
    string t;
    cin>>t;
    int idx;
    cin>>idx;
    vector<string> result;
    for(int p=0;p<in.size();++p)
    {
        if(in[p].size()!=t.size())
        {
            continue;
        }
        if(in[p]==t)
        {
            continue;
        }
        map<char,int> m1,m2;
        for(int m=0;m<t.size();++m)
        {
            m1[in[p][m]]++;
            m2[t[m]]++;
        }
        bool isright=true;
        for(int m=0;m<t.size();++m)
        {
            if(m1[t[m]]!=m2[t[m]])
            {
                isright=false;
                break;
            }
        }
        if(isright)
        {
           result.push_back(in[p]);
        }
            
    }
    sort(result.begin(),result.end());
    if(result.size()!=0)
    {
        cout<<result.size()<<endl;
        cout<<result[idx-1]<<endl;
    }
    else{
        cout<<'0'<<endl;
    }
  
    return 0;
}

以上是关于华为机试HJ27:查找兄弟单词的主要内容,如果未能解决你的问题,请参考以下文章

华为python机试题目:查找兄弟单词称砝码单词倒排购物单合并表记录

华为机试HJ31:单词倒排

华为机试HJ1:字符串最后一个单词的长度

华为机试HJ13:句子逆序

华为机试HJ36:字符串加密

华为机试HJ60:查找组成一个偶数最接近的两个素数