-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFindWordsFormdByChars.go
93 lines (69 loc) · 1.87 KB
/
FindWordsFormdByChars.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
You are given an array of strings words and a string chars.
A string is good if it can be formed by characters from chars (each character can only be used once).
Return the sum of lengths of all good strings in words.
Example 1:
Input: words = ["cat","bt","hat","tree"], chars = "atach"
Output: 6
Explanation:
The strings that can be formed are "cat" and "hat" so the answer is 3 + 3 = 6.
Example 2:
Input: words = ["hello","world","leetcode"], chars = "welldonehoneyr"
Output: 10
Explanation:
The strings that can be formed are "hello" and "world" so the answer is 5 + 5 = 10.
Note:
1 <= words.length <= 1000
1 <= words[i].length, chars.length <= 100
All strings contain lowercase English letters only.
*/
package main
import (
"log"
)
func main() {
tests := [][][]string{{{"cat", "bt", "hat", "tree"}, {"atach"}}, {{"hello", "world", "leetcode"}, {"welldonehoneyr"}}}
for _, test := range tests {
log.Printf("countCharacters(%v, %s) == %d\n", test[0], test[1][0], countCharacters(test[0], test[1][0]))
}
}
func countCharacters(words []string, chars string) int {
// create map of chars (with chars as keys) of the chars string
charMap := map[rune]int{}
for _, ch := range chars {
_, inMap := charMap[ch]
if inMap {
charMap[ch]++
} else {
charMap[ch] = 1
}
}
// check for each word given, if it can be constructed using given char set
goodCount := 0
for _, word := range words {
mapCopy := map[rune]int{}
for k, v := range charMap {
mapCopy[k] = v
}
if isGood(word, mapCopy) {
goodCount += len(word)
}
}
return goodCount
}
// check if every char in a given string exist in a given char map
func isGood(str string, charsMap map[rune]int) bool {
for _, ch := range str {
_, chExists := charsMap[ch]
if chExists {
if charsMap[ch] > 0 {
charsMap[ch]--
} else {
return false
}
} else {
return false
}
}
return true
}