2026-06-01 18:12:40 +08:00
|
|
|
#+ANKI_DECK: study_deck_02
|
2026-06-01 17:12:10 +08:00
|
|
|
* TODO 1408. String Matching in an Array :easy:
|
2026-06-01 02:33:30 +08:00
|
|
|
:PROPERTIES:
|
2026-06-01 17:22:07 +08:00
|
|
|
:NEETCODE: [[file:../../roadmap.org::*1408. String Matching in an Array][1408. String Matching in an Array]]
|
2026-06-01 02:33:30 +08:00
|
|
|
:END:
|
|
|
|
|
|
2026-06-01 17:22:07 +08:00
|
|
|
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*.
|
|
|
|
|
|
2026-06-01 02:39:53 +08:00
|
|
|
** TODO Approach
|
|
|
|
|
Write your approach here.
|
|
|
|
|
|
|
|
|
|
** TODO Python
|
|
|
|
|
#+begin_src python
|
2026-06-05 22:18:39 +08:00
|
|
|
from collections import defaultdict as dd
|
2026-06-01 17:22:07 +08:00
|
|
|
class Solution:
|
|
|
|
|
def stringMatching(self, words: List[str]) -> List[str]:
|
2026-06-05 22:18:39 +08:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2026-06-01 02:39:53 +08:00
|
|
|
#+end_src
|
|
|
|
|
|
2026-06-05 22:18:39 +08:00
|
|
|
**
|
|
|
|
|
|
2026-06-01 02:39:53 +08:00
|
|
|
** TODO C++
|
2026-06-01 02:33:30 +08:00
|
|
|
#+begin_src cpp
|
2026-06-01 17:22:07 +08:00
|
|
|
class Solution {
|
|
|
|
|
public:
|
|
|
|
|
vector<string> stringMatching(vector<string>& words) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
};
|
2026-06-01 02:33:30 +08:00
|
|
|
#+end_src
|