# 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" (doesn't include "a") and "based" (includes "s" which isn't in the puzzle).
Return an array answer, where answer[i] is the number of words in the given word list words that are valid with respect to the puzzle puzzles[i].

Example :

```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're no valid words for "gaswxyz" cause none of the words in the list contains letter 'g'.
```

Constraints:

• 1 <= words.length <= 10^5
• 4 <= words[i].length <= 50
• 1 <= puzzles.length <= 10^4
• puzzles[i].length == 7
• words[i][j], puzzles[i][j] are English lowercase letters.
• Each puzzles[i] doesn't contain repeated characters.

Solution:

```class Solution {
public List<Integer> findNumOfValidWords(String[] words, String[] puzzles) {
int m = words.length, n = puzzles.length;
Map<Integer, Integer> count = new HashMap();
List<Integer> res = new ArrayList();
for (int i = 0; i < m; i ++) {
int w = 0;
for (char c : words[i].toCharArray()) {
w |= 1 << (c - 'a');
}
count.put(w, count.getOrDefault(w, 0) + 1);
}
for (int i = 0; i < n; i ++) {
int p = 0, v = 0;
for (char c : puzzles[i].toCharArray()) {
p |= 1 << (c - 'a');
}
for (int sub = p; sub > 0; sub = (sub - 1) & p) {
int firstInP = puzzles[i].charAt(0) - 'a';
if ( (sub & (1 << firstInP)) > 0 && count.containsKey(sub)) {
// System.out.println(Integer.toBinaryString(w));
// System.out.println(Integer.toBinaryString(p[j]));
v += count.get(sub);
}
}