472. 连接词

2021/04/04 leetcode 共 1071 字,约 4 分钟

title

problem link

给定一个 不含重复 单词的字符串数组 words ,编写一个程序,返回 words 中的所有 连接词 。

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

示例 1:

输入:words = ["cat","cats","catsdogcats","dog","dogcatsdog","hippopotamuses","rat","ratcatdogcat"]
输出:["catsdogcats","dogcatsdog","ratcatdogcat"]
解释:"catsdogcats"由"cats", "dog" 和 "cats"组成; 
     "dogcatsdog"由"dog", "cats"和"dog"组成; 
     "ratcatdogcat"由"rat", "cat", "dog"和"cat"组成。

示例 2:

输入:words = ["cat","dog","catdog"]
输出:["catdog"]

提示:

  • 1 <= words.length <= 104
  • 0 <= words[i].length <= 1000
  • words[i] 仅由小写字母组成
  • 0 <= sum(words[i].length) <= 6 * 105

solution

https://github.com/azl397985856/leetcode/blob/master/problems/472.concatenated-words.md

class Solution:
    def findAllConcatenatedWordsInADict(self, words: List[str]) -> List[str]:
        trie = {}
        for word in words:
            node = trie
            for c in word:
                if c not in node:
                    node[c] = {}
                node = node[c]
            node['#'] = None
        import functools
        @functools.lru_cache(None)
        def cutWord(word) -> int:
            if not word: return 0
            node = trie
            res = float('-inf')
            for i, c in enumerate(word):
                if c not in node:
                    return res
                node = node[c]
                if "#" in node:
                    res = max(res, 1 + cutWord(word[i + 1:]))
            return res

        ans = []
        for word in words:
            if cutWord(word) >=2:
                ans.append(word)
        return ans

Search

    Table of Contents