题解 | #查找兄弟单词#
查找兄弟单词
http://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
这道题的题目描述简直。。。无语子,后来看了评论区的大佬解释在明白什么意思。
本题的题意是,先输入n个字符串,然后再输入一个字符串str,找这个str在之前n个字符串中的兄弟单词,被找到的兄弟单词要按字典顺序如abcdefg...排序,最后输入共有过少个兄弟单词,以及按字典顺序排好序以后的第n个(n从1开始算起)单词是什么?
解题思路:只是提供一个思路,这不一定是最好的,反正我只能想到这个。
通过容器map来记录每个单词中的字母出现次数如{a:1,b:2,c:1,d:4},如果两个单词的字母出现次数完全相同,但这两个单词不同,那么这两个单词就是兄弟单词,最后把找到的兄弟单词单独存放在一个vector容器中,并按字典顺序排序,最后输出就可以了
#include<bits/stdc++.h> using namespace std; int main() { int n,m; //n代表开始输入的数字,m代表最后输入的数字 cin>>n; //输入n cin.get(); //从键盘缓冲区读出换行符 string text,key; //text代表输入的前n个单词,key代表输入的最后一个单词 vector<string> vec,vec_; //向量vec和vec_分别存放一开始输入的单词组和兄弟单词组 for(int i=0;i<n;i++) { cin>>text; //依次输入前n个单词 cin.get(); //每次输入后从键盘缓冲区读出换行符 vec.push_back(text); //用容器vec保存输入的单词组 } cin>>key; //输入待查找的单词 cin>>m; //输入最后的数字 map<char, int> map1; //用容器mapjil每个单词的字符出现情况 map<char, int>::iterator it; //迭代器 for(int i=0;i<key.length();i++) { it = map1.find(key[i]); if(it != map1.end()) //如果找到了键为key[i]的键值对,将值+1 it->second++; else map1[key[i]] = 1; //否则,新生成一个{key[i], 1}的键值对 } for(int i=0;i<vec.size();i++) { //分析容器vec中每个单词的字符出现情况 map<char, int> map2; for(int j=0;j<vec[i].length();j++) { it = map2.find(vec[i][j]); if(it != map2.end()) it->second++; else map2[vec[i][j]] = 1; } if(vec[i] != key && map1 == map2) //如果某个单词与待查找的单词不同,并且字符出现情况一致,那么这个单词是星弟单词,将这个单词保存到容器vec_中 vec_.push_back(vec[i]); } sort(vec_.begin(), vec_.end()); //对容器vec_中的单词按字典顺序排序 cout<<vec_.size()<<endl; //打印容器vec_的大小,即为找到的星弟单词的个数 if(m<=vec_.size()) //打印第m个单词,如果没有符合第m个的话就不用打印了 cout<<vec_.at(m-1)<<endl; return 0; }