## Algorithm

Problem Name: 1178. Number of Valid Words for Each Puzzle

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]
```

Constraints:

• `1 <= words.length <= 105`
• `4 <= words[i].length <= 50`
• `1 <= puzzles.length <= 104`
• `puzzles[i].length == 7`
• `words[i]` and `puzzles[i]` consist of lowercase English letters.
• Each `puzzles[i] `does not contain repeated characters.

## Code Examples

### #1 Code Example with Javascript Programming

```Code - Javascript Programming```

``````
const findNumOfValidWords = function(words, puzzles) {
let n = puzzles.length,
offset = 'a'.charCodeAt()
let res = new Array(n).fill(0)
let cnt = {}

for (let w of words) {
for (let c of w) {
mask |= 1 << (c.charCodeAt() - offset)
}
}
for (let i = 0; i  <  n; i++) {
let s = puzzles[i],
len = s.length
for (let k = 0; k  <  1 << (len - 1); k++) {
let mask = 1 << (s[0].charCodeAt() - offset)
for (let j = 0; j  <  len - 1; j++) {
if (k & (1 << j)) {
mask |= 1 << (s[j + 1].charCodeAt() - offset)
}
}
}
}
return res
}
``````
Copy The Code &

Input

cmd
words = ["aaaa","asas","able","ability","actt","actor","access"], puzzles = ["aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"]

Output

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

### #2 Code Example with Python Programming

```Code - Python Programming```

``````
from itertools import combinations as cb
class Solution:
def findNumOfValidWords(self, words: List[str], puzzles: List[str]) -> List[int]:
cnt = collections.Counter(''.join(sorted(set(w))) for w in words)
return [sum(cnt[''.join(sorted(s + (p[0], )))] for l in range(len(p)) for s in cb(p[1:], l)) for p in puzzles]
``````
Copy The Code &

Input

cmd
words = ["aaaa","asas","able","ability","actt","actor","access"], puzzles = ["aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"]

Output

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