题目描述:
给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换。
请你找出所有用近义词替换后的句子,按 字典序排序 后返回。

示例 1:
输入:
synonyms = [[“happy”,“joy”],[“sad”,“sorrow”],[“joy”,“cheerful”]],
text = “I am happy today but was sad yesterday”
输出:
[“I am cheerful today but was sad yesterday”,
“I am cheerful today but was sorrow yesterday”,
“I am happy today but was sad yesterday”,
“I am happy today but was sorrow yesterday”,
“I am joy today but was sad yesterday”,
“I am joy today but was sorrow yesterday”]

提示:
0 <= synonyms.length <= 10
synonyms[i].length == 2
synonyms[0] != synonyms[1]
所有单词仅包含英文字母,且长度最多为 10 。
text 最多包含 10 个单词,且单词间用单个空格分隔开。

方法1:
主要思路:解题汇总链接
(1)使用bfs将各个近义词分成一组;
(2)将原来的语句text分割成各个单词,对每个单词找是否存在近义词,若存在近义词,则将对应的近义词可能的组成字符串都压入到结果字符串中;

class Solution {public:vector<string> generateSentences(vector<vector<string>>& synonyms, string text) {vector<string> res;//将原来的字符串进行分割,获得各个单词vector<string>words;int index=0;while(index<text.size()){int pos=index;while(pos<text.size()&&text[pos]!=' '){++pos;}words.push_back(text.substr(index,pos-index));index=pos+1;}vector<vector<string>> sts;//存储各个近义词集合//给出的近义词建立邻接图unordered_map<string,vector<string>> graph;for(auto&it:synonyms){graph[it[0]].push_back(it[1]);graph[it[1]].push_back(it[0]);}unordered_set<string> sign;//标识已经使用过的字符串unordered_map<string,int>mp;//各个近义词所在的集合的索引for(auto&it:graph){if(sign.count(it.first)){//当前单词已经使用过continue;}sign.insert(it.first);//标识当前单词已经使用过vector<string>cur_strs;//存储当前近义词集合cur_strs.push_back(it.first);queue<string>q;//bfs队列q.push(it.first);while(!q.empty()){string cur_str_node=q.front();q.pop();mp[cur_str_node]=sts.size();//当前近义词在所在近义词集合的索引for(string&str:graph[cur_str_node]){//各个可能的近义词if(sign.count(str)){continue;}sign.insert(str);q.push(str);cur_strs.push_back(str);}}sts.push_back(cur_strs);//将当前近义词集合压入集合数组中}res.push_back("");//存储结果for(int i=0;i<words.size();++i){//判断各个单词if(mp.count(words[i])==0){//说明当前单词不存在近义词for(string&str:res){if(str.size()==0){str+=words[i];}else{str+=" "+words[i];}}}else{//将各个近义词可能组成的新的字符串压入到结果数组中vector<string>& tmp=sts[mp[words[i]]];int cur_size=res.size();for(int j=1;j<tmp.size();++j){for(int k=0;k<cur_size;++k){if(res[k].size()==0){res.push_back(res[k]+tmp[j]);}else{res.push_back(res[k]+" "+tmp[j]);}}}for(int k=0;k<cur_size;++k){if(res[k].size()==0){res[k]+=tmp[0];}else{res[k]+=" "+tmp[0];}}}}sort(res.begin(),res.end());//排序return res;}
};

1258 近义词句子相关推荐

  1. LeetCode 1258. 近义词句子(哈希+并查集+排序+回溯)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换 ...

  2. Leetcode 1258:近义词句子(超详细的解法!!!)

    给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换. 请你找出所有用近义词替换后的句子,按 字典 ...

  3. 5110. 近义词句子

    给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换. 请你找出所有用近义词替换后的句子,按 字典 ...

  4. LeetCode-Python-1258. 近义词句子 ( DFS)

    给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换. 请你找出所有用近义词替换后的句子,按 字典 ...

  5. JAVA程序设计:近义词句子(LeetCode:5110)

    给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换. 请你找出所有用近义词替换后的句子,按 字典 ...

  6. 【每天一道算法题】近义词句子

    本文首发于我的公众号码农之屋(id: Spider1818),专注于干货分享,包含但不限于Java编程.网络技术.Linux内核及实操.容器技术等.欢迎大家关注,二维码文末可以扫. 题目描述 给你一个 ...

  7. 随手记_英语_学术写作_常用近义词区分

    1 近义词辨析 使用 utilize.use.apply.employ.avail.exploit的区别 (1)utilize往往指使本来无用的或开发的变为utile(有用的). (2)use.uti ...

  8. 责备的近义词_验收测试:责备工具

    责备的近义词 大约5年前,我正在进行一个项目,该项目旨在建立抵押品管理系统. 该系统已连接到大型财务网络,并通过标准化财务消息获得了说明. 该项目以瀑布形式运行,对学科之间的协作有很多限制. 在此不加 ...

  9. JAVA ik es_安装elasticsearch及中文IK和近义词配置

    安装elasticsearch及中文IK和近义词配置 安装java环境 java环境是elasticsearch安装必须的 yum install java-1.8.0-openjdk 安装elast ...

  10. python寻找近义词:预训练模型 nltk+20newsbydate / gensim glove 转 word2vec

    本文用python寻找英文近义词(中文:https://github.com/huyingxi/Synonyms) 使用的都是预训练模型 方法一.nltk+20newsbydate (运行时下载太慢/ ...

最新文章

  1. 机械制造与自动化专业学习单片机容易吗?如何学习单片机?
  2. 如何在 Linux 上录制你的终端操作
  3. python 如何删除frame 中的 label标签控件_玩转图形界面编程—解析Python小挑战No12(2)...
  4. c# xml的增删改查操作 xmlDocument 的用法
  5. Neutron 分布式虚拟路由(Neutron Distributed Virtual Routing)
  6. 荷兰牛栏 荷兰售价_荷兰的公路货运是如何发展的
  7. Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果
  8. keil4如何将c语言转换成汇编语言_keil中怎么在c语言里嵌入汇编语言
  9. vmware 虚拟机安装系统成功,没有虚拟网卡的完美解决方法
  10. 内部收益率计算公式用计算机,使用EXCEL函数公式计算内部收益率,请请人解决,非常感谢! ! !...
  11. 微信小程序添加体验成员,根据微信号搜索不到
  12. 产业的互联网化是什么时代_新时代:为什么互联网公司不应忽视65岁以上的一代...
  13. 5.3 10篇美食类小红书爆文拆解【玩赚小红书】
  14. 高尔顿与回归分析的起源
  15. 酒精测试仪方案开发PCBA
  16. dmz和端口映射_使用DMZ主机功能代替FTP服务端口映射无法使用的问题
  17. ElasticSearch 之 文本搜索
  18. Heartbleed bug
  19. C# printdocument打印分页处理
  20. JAVA分布式架构/亿万级病发面试题

热门文章

  1. AD学习问题记录(三):AD21版本如何重新定义板子形状
  2. 如何禁止软件联网,防止软件自动更新
  3. 复古冰雪传奇H5游戏详细图文架设教程
  4. 模拟登录人人网,豆瓣
  5. 自举电路工作原理分析
  6. STM32用于PWM占空比测量
  7. 数据分析之航空公司客户价值分析
  8. 技术人的未来(一)——跳槽
  9. python去头去尾.strip()函数用法:
  10. PPT幻灯片母版在制作时的应用