华为机试在线训练_查找兄弟单词(字符串,查找)

查找兄弟单词

http://www.nowcoder.com/questionTerminal/03ba8aeeef73400ca7a37a5f3370fe68

/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
水木清华
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;
}
大厂面试 文章被收录于专栏

分享有用的面试经历,倾吐有心的面试感悟,讲述有趣的面试故事,以飨读者。 常用语言是C++,编程力求规范整洁,题解清晰完整,像写诗一样去写代码。 本专栏文章系「人工智能安全」(微信公众号)原创,转载请联系本文作者。 欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。 我是一名有诗人气质的网络安全工程师,期待与你的思想交流碰撞出智慧的花火。

全部评论
你写题解给没法通过的代码???
1 回复 分享
发布于 2022-01-28 00:15
不是,你这解法跟题意都不一致。题目说的是任意交换两个字母。你的题解是交换任意多个字母。按照你这解法,BADC都可以是ABCD的兄弟。我还测试了一下,这就是错的解法!
点赞 回复 分享
发布于 04-06 09:54 河北
strs.erase(unique(strs.begin(), strs.end()),strs.end()); 那个sort在这题应该用错了吧,应该换成去重
点赞 回复 分享
发布于 2024-04-13 13:31 黑龙江
最后少了一个排序,通不过
点赞 回复 分享
发布于 2022-01-04 23:08

相关推荐

hwwhwh:同双非,有大厂实习其实也没啥用,主要看运气,等就行了
点赞 评论 收藏
分享
09-19 12:15
门头沟学院 Java
迷茫的大四🐶:这下是真的打牌了,我可以用感谢信和佬一起打牌吗
点赞 评论 收藏
分享
评论
23
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务