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
|
#!/usr/bin/env perl
use v5.38;
use List::Util qw( min );
sub charFrequency {
my $word = shift;
my %freq;
foreach my $c ( split //, $word ) {
$freq{$c}++;
}
return \%freq; # return a hash REFERENCE
}
sub commonCharacters {
my @words = @_;
my @freq = map { charFrequency($_) } @words;
# grab the character frequency map for the first word
my $first = shift @freq;
# now check the characters in the first word against
# the characters in all the subsequent words
foreach my $subsequent ( @freq ) {
foreach my $c ( keys %$first ) {
if (! exists $subsequent->{$c}) {
# this character isn't in subsequent words,
# so let's remove it from the frequency map
# of the first word
delete $first->{$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
my @output;
# once again, loop over the characters in the first word
foreach my $c ( split //, $words[0] ) {
next unless exists $first->{$c};
if ($first->{$c} > 1) {
# there's more than one occurence, so let's decrement
# the count for the next time through the loop
$first->{$c}--;
}
else {
# there is only one occurence left, so remove the
# character
delete $first->{$c};
}
push @output, $c;
}
return @output;
}
sub solution {
my @words = @_;
say 'Input: @words = ("' . join('", "', @words) . '")';
my @output = commonCharacters(@words);
say 'Output: ("' . join('", "', @output) . '")';
}
say "Example 1:";
solution("java", "javascript", "julia");
say "\nExample 2:";
solution("bella", "label", "roller");
say "\nExample 3:";
solution("cool", "lock", "cook");
|