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

简介: 华为机试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;
}
相关文章
|
2月前
【九度 OJ 08】简单查找x
【九度 OJ 08】简单查找x
15 0
|
7月前
|
索引
《华为机试》——查找两个字符串a,b中的最长公共子串
《华为机试》——查找两个字符串a,b中的最长公共子串
|
7月前
HJ27 查找兄弟单词
HJ27 查找兄弟单词
53 0
华为机试HJ106:字符逆序
华为机试HJ106:字符逆序
128 1
|
容器
华为机试HJ60:查找组成一个偶数最接近的两个素数
华为机试HJ60:查找组成一个偶数最接近的两个素数
华为机试HJ65:查找两个字符串a,b中的最长公共子串
华为机试HJ65:查找两个字符串a,b中的最长公共子串
|
存储 容器
华为机试HJ31:单词倒排
华为机试HJ31:单词倒排
华为机试HJ51:输出单向链表中倒数第k个结点
华为机试HJ51:输出单向链表中倒数第k个结点
|
存储 算法 C++
剑指offer(C++)-JZ50:第一个只出现一次的字符(算法-其他)
剑指offer(C++)-JZ50:第一个只出现一次的字符(算法-其他)