文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给你一个近义词表 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 个单词,且单词间用单个空格分隔开。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/synonymous-sentences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

class dsu
{vector<int> f;
public:dsu(int n){f.resize(n);for(int i = 0; i < n; ++i)f[i] = i;}void merge(int a, int b){int fa = find(a);int fb = find(b);f[fa] = fb;}int find(int a){int origin = a;while(a != f[a])a = f[a];return f[origin] = a;}
};
class Solution {unordered_map<string, int> w_id;//单词 id映射unordered_map<int, string> id_w;//id 单词unordered_map<int, vector<string>> f_words;//近义词代表id, 近义词集合vector<string> ans;//答案
public:vector<string> generateSentences(vector<vector<string>>& synonyms, string text) {int i = 0;for(auto& s : synonyms){if(!w_id.count(s[0])){w_id[s[0]] = i;id_w[i++] = s[0];}if(!w_id.count(s[1])){w_id[s[1]] = i;id_w[i++] = s[1];}}int n = w_id.size(), i1, i2, f;//并查集找集合dsu u(n);for(auto& s : synonyms){i1 = w_id[s[0]];i2 = w_id[s[1]];u.merge(i1, i2);//近义词合并}for(i = 0; i  < n; ++i){f = u.find(i);//近义词代表的idf_words[f].push_back(id_w[i]);//加入集合}for(auto& fw : f_words)sort(fw.second.begin(), fw.second.end());//近义词排序vector<string> sentenceWords;//获取句子里的单词string w;for(int i = 0; i < text.size(); ++i){if(text[i] == ' ' || i == text.size()-1){if(i == text.size()-1) w += text[i];sentenceWords.push_back(w);w = "";}elsew += text[i];}string path;bt(sentenceWords, 0, path, u);//回溯生成句子return ans;}void bt(vector<string>& sentenceWords, int i, string& path, dsu& u){if(i == sentenceWords.size()){path.pop_back();//空格ans.push_back(path);return;}int size = path.size();if(!w_id.count(sentenceWords[i])){   //没有近义词path += sentenceWords[i]+" ";bt(sentenceWords, i+1, path, u);path.resize(size);//回溯}else{int f = u.find(w_id[sentenceWords[i]]);//有近义词,近义词的代表ffor(int j = 0; j < f_words[f].size(); ++j)//遍历近义词集合{path += f_words[f][j]+" ";bt(sentenceWords, i+1, path, u);path.resize(size);//回溯}}}
};

4 ms 8.7 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

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

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

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

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

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

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

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

  4. 5110. 近义词句子

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. win10 spark+scala+eclipse+sbt 安装配置
  2. TCP、UDP绑定同一端口通信的解释
  3. Excel获得焦点变色
  4. 数据结构(C语言实现)第1章课后习题参考答案
  5. 飞鸽传书从天齐庙南门出来
  6. linux 小度 驱动_小度 WiFi 与 Windows 和 Linux
  7. 火山图 volcano
  8. 【复】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
  9. 基于 AUTOSAR 的电动汽车中央控制单元 CAN 通信软件开发
  10. 英语四级口语考试计算机考吗,听说四六级改革了,那英语四级考口语吗?
  11. Docker 之 Docker Machine
  12. ie浏览器通过ActiveX控件获取本机macip(附带批处理一键开启)
  13. keras入门教程 1.线性回归建模(快速入门)
  14. 再探Struts框架
  15. 单片机的延时与中断问题及解决方法
  16. MIUI“息屏听剧”功能实现调研
  17. 中小型企业 CRM 系统有哪些好的推荐?
  18. java矢量图_java – 矢量图形在iText PDF
  19. 信号的解调与调制matlab,基于MATLAB常用数字信号调制与解调
  20. angularjs1.6.x实例教程

热门文章

  1. tornado学习笔记day05-访问数据库
  2. click传值vue_对vue下点击事件传参和不传参的区别详解
  3. 线程自动退出_C++基础 多线程笔记(一)
  4. 命令行 java文本编辑工具 重载 内存区域 栈 堆
  5. 结构体的一些形式理解
  6. [leetcode] 14. 最长公共前缀
  7. Python中 sys.argv[]的用法
  8. C# 获取枚举的描述属性
  9. VirtualBox设置共享目录(主机win7,虚拟机Ubuntu)
  10. JavaScrip入门-变量计算%函数