#+ANKI_DECK: study_deck_02 * TODO 1408. String Matching in an Array :easy: :PROPERTIES: :NEETCODE: [[file:../../roadmap.org::*1408. String Matching in an Array][1408. String Matching in an Array]] :END: Given an array of string ~words~, return all strings in/ /~words~/ /that are a substring of another word. You can return the answer in *any order*. *Example 1:* #+begin_src Input: words = ["mass","as","hero","superhero"] Output: ["as","hero"] Explanation: "as" is substring of "mass" and "hero" is substring of "superhero". ["hero","as"] is also a valid answer. #+end_src *Example 2:* #+begin_src Input: words = ["leetcode","et","code"] Output: ["et","code"] Explanation: "et", "code" are substring of "leetcode". #+end_src *Example 3:* #+begin_src Input: words = ["blue","green","bu"] Output: [] Explanation: No string of words is substring of another string. #+end_src *Constraints:* - ~1 <= words.length <= 100~ - ~1 <= words[i].length <= 30~ - ~words[i]~ contains only lowercase English letters. - All the strings of ~words~ are *unique*. ** TODO Approach Write your approach here. ** TODO Python #+begin_src python from collections import defaultdict as dd class Solution: def stringMatching(self, words: List[str]) -> List[str]: words = reversed(sorted(words)) def squash(word, trie): lst = [] for c in word: lst.append([trie, '']) for i in range(len(lst)): lst[i][0] = lst[i][0][c] lst[i][1] += c if not lst[i][0]['ads']: lst[i][0]['ads'] = {lst[i][1]: [word]} else: lst[i][0]['ads'][lst[i][1]].append(word) def in_trie(word, trie): for c in word: if c not in trie: return [] trie = trie[c] return [(word, bw) for bw in trie['ads'][word]] trie_maker = lambda: dd(trie_maker) trie = trie_maker() ans = [] for s in words: ans += in_trie(s, trie) squash(s, trie) return ans #+end_src ** ** TODO C++ #+begin_src cpp class Solution { public: vector stringMatching(vector& words) { } }; #+end_src