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

思路:用map存一下近似关系,然后进行回溯遍历即可。

class Solution {private List<String> ans=new ArrayList<>();private Map<Integer,List<String>> map=new HashMap<>();private Set<String> st=new TreeSet<>((o1,o2)->o1.compareTo(o2));public List<String> generateSentences(List<List<String>> synonyms, String text) {int n=synonyms.size();int m=text.length(),len=0,maplen=0;String[] str=new String[m];StringBuilder s=new StringBuilder();for(int i=0;i<=m;i++) {if(i==text.length() || text.charAt(i)==' ') {str[len++]=s.toString();s.delete(0, s.length());continue;}if(i==text.length()) break;s.append(text.charAt(i));}for(int i=0;i<synonyms.size();i++) {boolean flag=false;for(List<String> x : map.values()){if(x.contains(synonyms.get(i).get(0)) && !x.contains(synonyms.get(i).get(1))) {flag=true;x.add(synonyms.get(i).get(1));}else if(x.contains(synonyms.get(i).get(1)) && !x.contains(synonyms.get(i).get(0))) {flag=true;x.add(synonyms.get(i).get(0));}}if(!flag) {map.put(maplen,new ArrayList<>());map.get(maplen).add(synonyms.get(i).get(0));map.get(maplen++).add(synonyms.get(i).get(1));}}dfs(synonyms,str,0,len,new StringBuilder());Iterator it=st.iterator();while(it.hasNext())ans.add((String)it.next());return ans;}private void dfs(List<List<String>> synonyms,String[] str,int nowlen,int len,StringBuilder s) {if(nowlen==len) {st.add(s.toString());return;}if(nowlen>0) s.append(' ');//System.out.println(s);for(List<String> list : map.values()) {if(list.contains(str[nowlen])) {for(int i=0;i<list.size();i++) {if(list.get(i).equals(str[nowlen]))continue;int tmp=list.get(i).length();s.append(list.get(i));int tmp1=s.length();dfs(synonyms,str,nowlen+1,len,s);s.delete(tmp1-tmp, tmp1);}}}s.append(str[nowlen]);int tmp=s.length();dfs(synonyms,str,nowlen+1,len,s);s.delete(tmp-str[nowlen].length()-(nowlen==0?0:1), tmp);//System.out.println(s);}
}

JAVA程序设计:近义词句子(LeetCode:5110)相关推荐

  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. 【每天一道算法题】近义词句子

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

  6. JAVA程序设计:连接词(LeetCode:472)

    给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat",&qu ...

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

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

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

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

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

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

最新文章

  1. VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
  2. 李笑来 css,李笑来都想投资千万美金的ACSS通证即将强势登陆奇点交易所
  3. 0005-Longest Palindromic Substring(最长回文子串)
  4. SAP Spartacus Table cell显示数据类型的Component决定逻辑
  5. 用英语回答问题 - 一个SAP开发人员为什么要练习双截棍
  6. FileOutputStreamTest
  7. 容器编排技术 -- kubernetes设计理念
  8. Linux内存管理(一)——从硬件角度看内存管理
  9. android 控件总结,Android制霸控件View总结
  10. python os.getpidos.getppid
  11. C# Json 和对象的相互转换
  12. Guava学习笔记(零):Google Guava 类库简介
  13. c#位数不够0补充完_人教版四年级上册数学第六单元《除数是两位数的除法》
  14. 兼容所有浏览器的快速Web打印控件下载
  15. android 经纬度方向,Android获取经纬度计算距离介绍
  16. 关于NuDaqPci 数据采集
  17. 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询
  18. 不重启linux服务器禁用U盘,如何在Linux服务器上禁用U盘?
  19. 微软并购雅虎案:世界商业三巨头的财智较量
  20. 如何获取微信公众号的关注链接?

热门文章

  1. 有n个人围成一圈 顺序排号 java_java基础编程题有n个人围成一圈顺序排号
  2. 第十三讲 测试用例编写方法
  3. C语言float转char数组
  4. 创业:理性地选择一个适合自己的项目
  5. 安卓手机APP兼容性测试如何有效进行?
  6. PDU发送短信 事例
  7. 初学者冒泡排序C语言
  8. Reack hooks的使用
  9. 笔记本电脑连接蓝牙耳机设备
  10. 掌握关键词排名技巧,用爱站工具包!