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:
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:


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);
                }
            }
            res.add(v);
        }
        return res;
    }
}