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
|
#!/usr/bin/env python
from collections import Counter
def charFrequency(word):
# https://docs.python.org/3/library/collections.html#counter-objects
freq = Counter()
for c in word:
freq[c] += 1
return freq
def commonCharacters(words):
# get the character freqencies for each word
freq = list(map(charFrequency, words))
# grab the character frequency map for the first word
first = freq.pop(0)
# make a copy of the dictionary since we'll
# be modifying it in the loop
first_orig = dict(first)
# now check the characters in the first word against
# the characters in all the subsequent words
for subsequent in freq:
for c in first_orig:
if c not in subsequent:
# this character isn't in subsequent words,
# so let's remove it from the frequency map
# of the first word
first.pop(c)
else:
# the character IS in subsequent words,
# so let's set the frequency count to be
# the minimum count found in those words
first[c] = min(first[c], subsequent[c])
# now we generate a list of characters in the order they
# appear in the first word
output = []
# once again, loop over the characters in the first word
for c in words[0]:
if c not in first:
continue
if first[c] > 1:
first[c] -= 1
else:
first.pop(c)
output.append(c)
return output
def solution(words):
quoted = '"' + '", "'.join(words) + '"'
print(f'Input: @words = ({quoted})')
output = commonCharacters(words)
quoted = '"' + '", "'.join(output) + '"'
print(f'Output: ({quoted})')
print("Example 1:")
solution(["java", "javascript", "julia"])
print("\nExample 2:")
solution(["bella", "label", "roller"])
print("\nExample 3:")
solution(["cool", "lock", "cook"])
|