## C# || How To Find Number Of Valid Words For Each Puzzle Using C# The following is a module with functions which demonstrates how to find the number of valid words for each puzzle using C#.

1. Find Num Of Valid Words – Problem Statement

With respect to a given puzzle string, a word is valid if both the following conditions are satisfied:

• word contains the first letter of puzzle.
• For each letter in word, that letter is in puzzle.
• For example, if the puzzle is “abcdefg”, then valid words are “faced”, “cabbage”, and “baggage”, while
• invalid words are “beefed” (does not include ‘a’) and “based” (includes ‘s’ which is not in the puzzle).

Return an array answer, where answer[i] is the number of words in the given word list words that is valid with respect to the puzzle puzzles[i].

Example 1:

``` Input: words = ["aaaa","asas","able","ability","actt","actor","access"], puzzles = ["aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"] Output: [1,1,3,2,4,0] Explanation: 1 valid word for "aboveyz" : "aaaa" 1 valid word for "abrodyz" : "aaaa" 3 valid words for "abslute" : "aaaa", "asas", "able" 2 valid words for "absoryz" : "aaaa", "asas" 4 valid words for "actresz" : "aaaa", "asas", "actt", "access" There are no valid words for "gaswxyz" cause none of the words in the list contains letter 'g'. ```

Example 2:

``` Input: words = ["apple","pleas","please"], puzzles = ["aelwxyz","aelpxyz","aelpsxy","saelpxy","xaelpsy"] Output: [0,1,3,2,0] ```

2. Find Num Of Valid Words – Solution

The following is a solution which demonstrates how to find the number of valid words for each puzzle.

This solution uses a Trie to find the number of valid words.

``` 2. Find Num Of Valid Words - Solution C# // ============================================================================ // Author: Kenneth Perkins // Date: Nov 9, 2021 // Taken From: http://programmingnotes.org/ // File: Solution.cs // Description: Demonstrates how to find number of valid words in a puzzle // ============================================================================ public class Solution { public IList<int> FindNumOfValidWords(string[] words, string[] puzzles) { // Add words to the Trie var trie = new Trie(); foreach (var word in words) { // Get distinct characters in the word and sort it var chars = word.Distinct().ToArray(); // Longer words are never valid if (chars.Length <= 7) { Array.Sort(chars); trie.Insert(new string(chars)); } } // Check how many words in the puzzle match in the Trie var result = new List<int>(); foreach (var word in puzzles) { result.Add(trie.Search(word)); } return result; } // Trie public class Trie { private TrieNode root; public Trie() { root = new TrieNode(); } public void Insert(string word) { var node = root; foreach (var ch in word) { if (!node.ContainsKey(ch)) { node.Add(ch, new TrieNode()); } node = node.Get(ch); } node.SetComplete(); } public int Search(string word) { return DFS(root, word, false); } private int DFS(TrieNode node, string word, bool firstFound) { var result = firstFound ? node.WordCount() : 0; foreach (var ch in word) { if (node.ContainsKey(ch)) { result += DFS(node.Get(ch), word, firstFound || ch == word); } } return result; } } // TrieNode public class TrieNode { private Dictionary<char, TrieNode> children; private bool isComplete; private int count; public TrieNode() { children = new Dictionary<char, TrieNode>(); } public bool ContainsKey(char ch) { return children.ContainsKey(ch); } public TrieNode Get(char ch) { return children[ch]; } public void Add(char ch, TrieNode node) { children[ch] = node; } public void SetComplete() { isComplete = true; ++count; } public bool IsComplete() { return isComplete; } public int WordCount() { return count; } } }// http://programmingnotes.org/ 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 // ============================================================================//    Author: Kenneth Perkins//    Date:   Nov 9, 2021//    Taken From: http://programmingnotes.org///    File:  Solution.cs//    Description: Demonstrates how to find number of valid words in a puzzle// ============================================================================public class Solution {    public IList<int> FindNumOfValidWords(string[] words, string[] puzzles) {        // Add words to the Trie        var trie = new Trie();        foreach (var word in words) {            // Get distinct characters in the word and sort it            var chars = word.Distinct().ToArray();             // Longer words are never valid            if (chars.Length <= 7) {                Array.Sort(chars);                trie.Insert(new string(chars));            }        }         // Check how many words in the puzzle match in the Trie        var result = new List<int>();        foreach (var word in puzzles) {            result.Add(trie.Search(word));        }        return result;    }     // Trie    public class Trie {        private TrieNode root;         public Trie() {            root = new TrieNode();        }        public void Insert(string word) {            var node = root;            foreach (var ch in word) {                if (!node.ContainsKey(ch)) {                    node.Add(ch, new TrieNode());                }                node = node.Get(ch);            }            node.SetComplete();        }        public int Search(string word) {            return DFS(root, word, false);        }        private int DFS(TrieNode node, string word, bool firstFound) {            var result = firstFound ? node.WordCount() : 0;            foreach (var ch in word) {                if (node.ContainsKey(ch)) {                    result += DFS(node.Get(ch), word, firstFound || ch == word);                }            }            return result;        }    }     // TrieNode    public class TrieNode {        private Dictionary<char, TrieNode> children;        private bool isComplete;        private int count;         public TrieNode() {            children = new Dictionary<char, TrieNode>();        }        public bool ContainsKey(char ch) {            return children.ContainsKey(ch);        }        public TrieNode Get(char ch) {            return children[ch];        }        public void Add(char ch, TrieNode node) {            children[ch] = node;        }        public void SetComplete() {            isComplete = true;            ++count;        }        public bool IsComplete() {            return isComplete;        }        public int WordCount() {            return count;        }    }}// http://programmingnotes.org/ ```

QUICK NOTES:
The highlighted lines are sections of interest to look out for.

The code is heavily commented, so no further insight is necessary. If you have any questions, feel free to leave a comment below.

Once compiled, you should get this as your output for the example cases:

``` [1,1,3,2,4,0] [0,1,3,2,0] ```