/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
水木清华
2020-03-22
查找兄弟单词
*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//查找兄弟单词的函数接口,兄弟单词:单词的字母及其个数相同,但字母的排列顺序不全相同
int Search_Brother_Word(int num)
{
string str; //字典里面的单词(小写英文字符)
string word; //指定的单词
vector <string> vec; //用一个向量来存储单词(形成单词字典)
vector <string> vec_BW; //用一个向量来存储兄弟单词(形成兄弟单词字典),BW 代表 Brother Word
int BW_index; //序号,用于查找指定单词的所有兄弟单词中序号所对应的兄弟单词(序号减一,因为从零开始)
//输入单词,形成单词字典
for (int i = 0; i < num; i++)
{
cin >> str;
vec.push_back(str);
}
sort(vec.begin(), vec.end()); //输入的多个单词按字典序排列
cin >> word; //指定单词,当然这个单词可能在、也可能不在原来的字典里面
cin >> BW_index; //指定单词 word 的所有兄弟单词中排在第 BW_index 的单词对应序号 BW_index - 1
//判断字典中的单词是否为指定单词的兄弟单词,若是,则将其写入兄弟单词向量 vec_BW
string word_copy = word; //拷贝一份指定的单词,作为基准比较(字母顺序未变动)
sort(word.begin(), word.end()); //指定的单词的字母按字典序排列
//遍历单词字典,寻找指定单词的兄弟单词并记录在兄弟单词字典中
for (int i = 0; i < vec.size(); i++)
{
//先判断字典中的单词的长度和指定单词的长度是否一致
if (vec[i].size() == word.size())
{
//长度相同且字母顺序不同的单词,才可能是兄弟单词,这里反复用单词的拷贝来作为基准
if (vec[i] != word_copy)
{
string copy = vec[i]; //提前拷贝一份字典中的单词,作为后续写入兄弟单词字典的样本(需要的话)
sort(vec[i].begin(), vec[i].end()); //字典中的单词的字母按字典序排列
//原本不相同的单词,经过字母排序后相同,才是互为兄弟单词
if (vec[i] == word)
{
vec_BW.push_back(copy);
}
}
}
}
//分类输出结果
//兄弟单词字典为空
if (vec_BW.size() == 0)
{
cout << 0 << endl;
}
//兄弟单词字典不为空,但待查找的兄弟单词不存在
else if (((vec_BW.size() > 0) && (vec_BW.size() < BW_index)) || ((vec_BW.size() > 0) && (BW_index < 1)))
{
cout << vec_BW.size() << endl;
}
//兄弟单词字典不为空,且待查找的兄弟单词存在
else if ((vec_BW.size() > 0) && (vec_BW.size() >= BW_index) && (BW_index >= 1))
{
cout << vec_BW.size() << '\n' << vec_BW[BW_index - 1] << endl;
}
return 0;
}
//主函数
int main()
{
int num;
while (cin >> num)
{
Search_Brother_Word(num);
}
return 0;
}