这道题的题目描述简直。。。无语子,后来看了评论区的大佬解释在明白什么意思。
本题的题意是,先输入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;
} 
京公网安备 11010502036488号