zoukankan      html  css  js  c++  java
  • Leetcode: Concatenated Words

    Given a list of words, please write a program that returns all concatenated words in the given list of words.
    
    A concatenated word is defined as a string that is comprised entirely of at least two shorter words in the given array.
    
    Example:
    Input: ["cat","cats","catsdogcats","dog","dogcatsdog","hippopotamuses","rat","ratcatdogcat"]
    
    Output: ["catsdogcats","dogcatsdog","ratcatdogcat"]
    
    Explanation: "catsdogcats" can be concatenated by "cats", "dog" and "cats"; 
     "dogcatsdog" can be concatenated by "dog", "cats" and "dog"; 
    "ratcatdogcat" can be concatenated by "rat", "cat", "dog" and "cat".
    Note:
    The number of elements of the given array will not exceed 10,000
    The length sum of elements in the given array will not exceed 600,000.
    All the input string will only include lower case letters.
    The returned elements order does not matter.

    Scan through array and DP:

    We iterate through each word and see if it can be formed by using other words. The subproblem is Word Break I.

    But it is a little different from Word Break I, because our result only want words that are concantenated by 2 or more other words in the given array.

    How to tell if a word is only by itself in the given array, or it can be concatenated by other words in the given array?

    The trick is: it is obvious that a word can only be formed by words shorter than it. So we can first sort the input by length of each word, and only try to form one word by using words in front of it. We also do not add the current word to dictionary when determine if it can be concantenated.

    小心一个test case:

    Input:[""]
    Output:[""]
    Expected:[]
    如果不加21行那句,就会直接return dp[0], true了
     1 public class Solution {
     2     public List<String> findAllConcatenatedWordsInADict(String[] words) {
     3         List<String> res = new ArrayList<>();
     4         if (words==null || words.length==0) return res;
     5         HashSet<String> dict = new HashSet<>();
     6         Arrays.sort(words, new Comparator<String>() {
     7             public int compare(String str1, String str2) {
     8                 return str1.length() - str2.length();
     9             }
    10         });
    11 
    12         for (String word : words) {
    13             if (canForm(word, dict))
    14                 res.add(word);
    15             dict.add(word);
    16         }
    17         return res;
    18     }
    19     
    20     public boolean canForm(String word, HashSet<String> dict) {
    21         if (dict.isEmpty()) return false;
    22         boolean[] dp = new boolean[word.length()+1];
    23         dp[0] = true;
    24         for (int i=1; i<=word.length(); i++) {
    25             for (int j=0; j<i; j++) {
    26                 if (!dp[j]) continue;
    27                 String str = word.substring(j, i);
    28                 if (dp[j] && dict.contains(str)) {
    29                     dp[i] = true;
    30                     break;
    31                 }
    32             }
    33         }
    34         return dp[word.length()];
    35     }
    36 }

    这题还应该研究一下Trie的解法, 目前还没有想好,也没有看到不错的Trie 解法

  • 相关阅读:
    谈谈 rm -rf * 后的几点体会(年轻人得讲码德)
    shell读取文档中的命令并逐行执行
    被踢出工作群聊后的若干反思
    units命令单位转换
    想买保时捷的运维李先生学Java性能之 垃圾收集器
    想买保时捷的运维李先生学Java性能之 垃圾收集算法
    想买保时捷的运维李先生学Java性能之 生存与毁灭
    想买保时捷的运维李先生 求救求救求救求救
    想买保时捷的运维李先生学Java性能之 运行时数据区域
    想买保时捷的运维李先生学Java性能之 JIT即时编译器
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/6213426.html
Copyright © 2011-2022 走看看