文章目录

  • 1、题目描述
  • 2、解题思路
  • 3、解题代码

1、题目描述

2、解题思路

  使用并查集集中管理所有的同义词,然后使用一个 HashMap 存储近义词集合,key 为并查集的 parent,value 为并查集 parent 对应的集合。

  对 text 每一个单词进行深度优先搜索:

  1、判断当前单词是否有同义词,如果有,则当前单词替换为所有的可能的近义词;

  2、接着对下一个单词进行 DFS。

  中间涉及大量的字符串拼接,不要直接用加号,而是使用 StringBuilder 来进行拼接,需要注意的是,需要进行同义词替换时,要新建一个 StringBuilder 继续往下深入,而不是一个 StringBuilder 用到底。

3、解题代码

class Solution {private Word word;private Map<String, HashSet<String>> dic = new HashMap<>();public List<String> generateSentences(List<List<String>> synonyms, String text) {List<String> ans = new ArrayList<>();if (text == null || text.length() == 0) {return ans;}if (synonyms == null || synonyms.size() == 0) {ans.add(text);return ans;}word = new Word(synonyms);// 让近义词进行合并for (List<String> synonym : synonyms) {word.union(synonym.get(0), synonym.get(1));}// 分类存储近义词到 dic 中for (List<String> synonym : synonyms) {String parent = word.findParent(synonym.get(0));dic.putIfAbsent(parent, new HashSet<>());dic.get(parent).add(synonym.get(0));dic.get(parent).add(synonym.get(1));}// 待替换的单词数组String[] textArray = text.split(" ");dfs(ans, textArray, 0, new StringBuilder());ans.sort((a, b) -> a.compareTo(b));return ans;}/*** 从 textArray 的第 idx 个单词开始替换近义词,替换后的新句子放到 ans 中** @param ans* @param textArray* @param idx* @param sb*/private void dfs(List<String> ans, String[] textArray, int idx, StringBuilder sb) {if (idx == textArray.length) {// 已经到末尾了,全部替换完毕ans.add(sb.toString().trim());return;}// 如果当前近义词字典不存在当前单词,则跳过当前单词if (!word.map.containsKey(textArray[idx])) {dfs(ans, textArray, idx + 1, sb.append(" ").append(textArray[idx]));} else {// 获取当前待替换单词的父亲String parent = word.findParent(textArray[idx]);// 找到所有近义词HashSet<String> strings = dic.get(parent);// 当前单词用近义词代替for (String string : strings) {StringBuilder sbb = new StringBuilder(sb);dfs(ans, textArray, idx + 1, sbb.append(" ").append(string));}}}class Word {/*** key 为字符串* value 为父字符串*/Map<String, String> map;Word(List<List<String>> synonyms) {map = new HashMap<>();for (List<String> synonym : synonyms) {for (String s : synonym) {// 初始每个字符串的父字符串为其本身map.put(s, s);}}}void union(String s1, String s2) {String parent1 = findParent(s1);String parent2 = findParent(s2);if (!parent1.equals(parent2)) {map.put(s2, parent1);}}String findParent(String s) {while (!s.equals(map.get(s))) {s = map.get(s);}return s;}}
}

【LeetCode - 1258】近义词句子相关推荐

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

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

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

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

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

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

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

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

  5. 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. 【Qt】通过QtCreator源码学习Qt(四):插件管理PluginManager
  2. Android SlidingMenu以及ActionBarSherlock的基础使用教程
  3. Python内置函数zip map filter的使用
  4. SAP ABAP实用技巧介绍系列之 How is configuration data loaded
  5. js请求php文件 302,采集某个 url, js 请求 200,浏览器访问 302
  6. 关于在nw里使用require('printer')和nw.require('printer')报错的问题
  7. iPhone X 弹出输入框隐藏后页面上移不回位问题的解决办法
  8. Android开发-Android项目结构
  9. AD14 元件引脚名称消失不见了 解决
  10. python 中 websocket实现消息定时推送
  11. i3 10100F和i3 10105F差距大不大
  12. empty怎么发音_empty是什么意思_empty在线翻译_英语_读音_用法_例句_海词词典
  13. 网站备案 服务器变更,网站变更服务器备案
  14. Excel公式笔记(COUNTIFS)
  15. html如何在页面打开时让鼠标光标停留在某个表单文本框,网页制作实用技巧
  16. ccs中c语言定义布尔常量,ccs库里面有变量的定义,我在添加了头文件后编译显示没有定义变量呢...
  17. python里的self
  18. WAV 和AAC格式
  19. JavaWeb技术内幕八:JVM内存管理
  20. android 自定义图片,Android自定义图片集合

热门文章

  1. MIPI归纳---为什么阻抗为100欧姆
  2. 区块链是世界第九大奇迹,它在触动钱、信任和权力!
  3. 编辑器——sublime
  4. Intel E810 DDP在VPP offload加速框架中的应用
  5. Android Studio连接MuMu模拟器
  6. HTML中的表单标签
  7. 850是什么意思_850是什么意思
  8. MOS管常用电路分析
  9. h桥控制电机刹车_基于H桥控制直流电机驱动电路设计
  10. 国内厉害的中式风格设计师有哪些人