华为机试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:查找兄弟单词的主要内容,如果未能解决你的问题,请参考以下文章