From 6ba396d159ca30edd6e0341f816e53b6fd8bdb78 Mon Sep 17 00:00:00 2001 From: Fazeel Usmani Date: Tue, 9 Nov 2021 18:48:05 +0530 Subject: [PATCH] Create 9_numValidWords.cpp --- .../9_numValidWords.cpp | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 11 November Leetcode Challenge 2021/9_numValidWords.cpp diff --git a/11 November Leetcode Challenge 2021/9_numValidWords.cpp b/11 November Leetcode Challenge 2021/9_numValidWords.cpp new file mode 100644 index 0000000..b5e4a27 --- /dev/null +++ b/11 November Leetcode Challenge 2021/9_numValidWords.cpp @@ -0,0 +1,42 @@ +class Solution { +public: + vector findNumOfValidWords(vector& words, vector& puzzles) { + int SIZE = 26; // total character size + vector> trie = {vector(SIZE)}; // we use vector to mimic the trie tree + vector count = {0}; // the number of words ending at node i + for (string word : words) { // we do not use reference here to avoid modifying the input + sort(word.begin(), word.end()); + word.erase(unique(word.begin(), word.end()), word.end()); + if (word.size() <= 7) { // longer words are never valid + // insert into trie + int node = 0; + for (char& letter : word) { + int i = letter - 'a'; + if (trie[node][i] == 0) { // push empty node + trie.push_back(vector(SIZE)); + count.push_back(0); + trie[node][i] = trie.size() - 1; + } + node = trie[node][i]; + } + count[node]++; + } + } + // search for valid words + function dfs = [&](int node, bool hasFirst, string& puzzle) { + int total = hasFirst ? count[node] : 0; + for (char& letter : puzzle) { + int i = letter - 'a'; + if (trie[node][i]) { + total += dfs(trie[node][i], hasFirst || (letter == puzzle[0]), puzzle); + } + } + return total; + }; + vector result; + for (string& puzzle : puzzles) { + result.push_back(dfs(0, false, puzzle)); + } + return result; + } +};