• Java实现 LeetCode 472 连接词


    472. 连接词

    给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词。

    连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的。

    示例:

    输入: [“cat”,“cats”,“catsdogcats”,“dog”,“dogcatsdog”,“hippopotamuses”,“rat”,“ratcatdogcat”]

    输出: [“catsdogcats”,“dogcatsdog”,“ratcatdogcat”]

    解释: “catsdogcats"由"cats”, “dog” 和 "cats"组成;
    “dogcatsdog"由"dog”, "cats"和"dog"组成;
    “ratcatdogcat"由"rat”, “cat”, "dog"和"cat"组成。
    说明:

    给定数组的元素总数不超过 10000。
    给定数组中元素的长度总和不超过 600000。
    所有输入字符串只包含小写字母。
    不需要考虑答案输出的顺序。

    class Solution {
        private Set<String> wordSet;
    
        public List<String> findAllConcatenatedWordsInADict(String[] words) {
    
            wordSet = new HashSet<>();
            for (String word : words) {
                wordSet.add(word);
            }
    
            List<String> result = new ArrayList<String>();
            Arrays.asList(words).parallelStream().forEach(word -> {
                if (dfs(word, 0, 0, new StringBuilder())) {
                    result.add(word);
                }
            });
    
            return result;
        }
    
        private boolean dfs(String word, int count, int start, StringBuilder sb) {
            for (int i = start; i < word.length(); i++) {
                sb.append(word.charAt(i));
                boolean isWord = wordSet.contains(sb.toString());
                if (isWord && dfs(word, count + 1, i + 1, new StringBuilder())) {
                    return true;
                }
            }
            return count > 1 && (wordSet.contains(sb.toString()) || start == word.length());
        }
    }
    
  • 相关阅读:
    毕业面试试题汇总
    js获取系统日期
    非常酷的3D翻转相册展示特效
    CSS 替换元素和非替换元素 行内非替换元素
    怎样在linux下编写C程序并编译执行
    库和框架的区别
    转载:em(倍)与px的区别
    RPMForge介绍及安装
    linux下安装jdk和配置环境变量
    PCI PCI-X PCI-E介绍
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13075638.html
Copyright © 2020-2023  润新知