472. 连接词

exiaohu 于 2021-12-28 发布

题目链接:472. 连接词

字典树,配合深度优先搜索。

在字典树中存储每一个字母,可能的后续字母,若可能为词的末尾,用 # 表示。

from typing import List


class Trie(object):
    def __init__(self):
        self.data = dict()

    def insert(self, word):
        data = self.data
        for char in word:
            if char not in data:
                data[char] = dict()
            data = data[char]
        data['#'] = dict()

    def query(self, word):
        if len(word) == 0:
            return True

        data = self.data
        for i, char in enumerate(word):
            if char in data:
                data = data[char]
            else:
                return False

            if '#' in data and self.query(word[i + 1:]):
                return True
        return False


class Solution:
    def findAllConcatenatedWordsInADict(self, words: List[str]) -> List[str]:
        words = sorted(words, key=len)
        trie, result = Trie(), list()

        for word in words:
            if len(word) == 0:
                continue

            if trie.query(word):
                result.append(word)
            else:
                trie.insert(word)

        return result