From b2cb398c717e5b23bbbdc271f94599fa405b7d52 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Tue, 9 Nov 2021 02:07:53 +0000 Subject: [PATCH] number-of-valid-words-for-each-puzzle --- number-of-valid-words-for-each-puzzle/sol.go | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 number-of-valid-words-for-each-puzzle/sol.go diff --git a/number-of-valid-words-for-each-puzzle/sol.go b/number-of-valid-words-for-each-puzzle/sol.go new file mode 100644 index 0000000..548d3d1 --- /dev/null +++ b/number-of-valid-words-for-each-puzzle/sol.go @@ -0,0 +1,30 @@ +package main + +func mask(str string) int { + mask := 0 + for _, r := range str { + mask |= 1 << (r - 'a') + } + return mask +} + +func findNumOfValidWords(words []string, puzzles []string) []int { + word_masks := make(map[int]int) + for _, word := range words { + mask := mask(word) + word_masks[mask] += 1 + } + + out := make([]int, len(puzzles)) + for pi, puzzle := range puzzles { + pc := mask(puzzle[1:]) + fc := 1 << (puzzle[0] - 'a') + count, submask := word_masks[fc], pc + for submask != 0 { + count += word_masks[submask|fc] + submask = (submask - 1) & pc + } + out[pi] = count + } + return out +}