题目
https://leetcode-cn.com/problems/number-of-valid-words-for-each-puzzle/
字典树
class Solution {
TrieNode root;
public List<Integer> findNumOfValidWords(String[] words, String[] puzzles) {
root = new TrieNode();
for (String word : words) {
char[] arr = word.toCharArray();
Arrays.sort(arr);
StringBuilder bd = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
if (i == 0 || arr[i - 1] != arr[i]) {
bd.append(arr[i]);
}
}
insert(bd.toString());
}
List<Integer> ans = new ArrayList<>();
for (String puzzle : puzzles) {
char required = puzzle.charAt(0);
char[] arr = puzzle.toCharArray();
Arrays.sort(arr);
ans.add(find(arr, required, root,0));
}
return ans;
}
public int find(char[] puzzle, char required, TrieNode cur, int pos) {
if (cur == null)
return 0;
if (pos == 7)
return cur.freq;
int ret = find(puzzle, required, cur.children[puzzle[pos] - 'a'], pos + 1);
if (puzzle[pos] != required) {
ret += find(puzzle, required, cur, pos + 1);
}
return ret;
}
public void insert(String word) {
TrieNode cur = root;
for (char c : word.toCharArray()) {
if (cur.children[c - 'a'] == null) {
cur.children[c - 'a'] = new TrieNode();
}
cur = cur.children[c - 'a'];
}
cur.freq++;
}
class TrieNode {
int freq;
TrieNode[] children;
TrieNode () {
freq = 0;
children = new TrieNode[26];
}
}
}
二进制状态压缩
class Solution {
public List<Integer> findNumOfValidWords(String[] words, String[] puzzles) {
Map<Integer, Integer> freq = new HashMap<>();
for (String word : words) {
int mask = 0;
for (int i = 0; i < word.length(); i++) {
mask |= (1 << (word.charAt(i) - 'a'));
}
if (Integer.bitCount(mask) <= 7)
freq.put(mask, freq.getOrDefault(mask, 0) + 1);
}
List<Integer> ans = new ArrayList<>(10000);
for (String puzzle : puzzles) {
int total = 0;
for (int i = 0; i < (1 << 6); i++) {
int mask = 0;
for (int j = 0; j < 6; j++) {
if ((i & (1 << j)) != 0) {
mask |= (1 << (puzzle.charAt(j + 1) - 'a'));
}
}
mask |= (1 << (puzzle.charAt(0) - 'a'));
if (freq.containsKey(mask))
total += freq.get(mask);
}
ans.add(total);
}
return ans;
}
}