zoukankan      html  css  js  c++  java
  • 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());
        }
    }
    
  • 相关阅读:
    P4141 消失之物(退背包模板)
    P5829 【模板】失配树
    P4827 [国家集训队] Crash 的文明世界
    P4074 [WC2013]糖果公园
    P3242 [HNOI2015]接水果
    P2371 [国家集训队]墨墨的等式
    P4819 [中山市选]杀人游戏
    P5331 [SNOI2019]通信
    BZOJ1082 [SCOI2005]栅栏
    poj1475 Pushing Boxes[双重BFS(毒瘤搜索题)]
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12946450.html
Copyright © 2011-2022 走看看