The weekly challenge 377 - Task 2: Prefix Suffix
1 #!/usr/bin/env perl 2 # https://theweeklychallenge.org/blog/perl-weekly-challenge-377/#TASK2 3 # 4 # Task 2: Prefix Suffix 5 # ===================== 6 # 7 # You are given an array of strings. 8 # 9 # Write a script to find if the two strings (str1, str2) in the given array 10 # such that str1 is prefix and suffix of str2. Return the total count of such 11 # pairs. 12 # 13 ## Example 1 14 ## 15 ## Input: @array = ("a", "aba", "ababa", "aa") 16 ## Output: 4 17 ## 18 ## $array[0], $array[1]: "a" is a prefix and suffix of "aba" 19 ## $array[0], $array[2]: "a" is a prefix and suffix of "ababa" 20 ## $array[0], $array[3]: "a" is a prefix and suffix of "aa" 21 ## $array[1], $array[2]: "aba" is a prefix and suffix of "ababa" 22 # 23 ## Example 2 24 ## 25 ## Input: @array = ("pa", "papa", "ma", "mama") 26 ## Output: 2 27 ## 28 ## $array[0], $array[1]: "pa" is a prefix and suffix of "papa" 29 ## $array[2], $array[3]: "ma" is a prefix and suffix of "mama" 30 # 31 ## Example 3 32 ## 33 ## Input: @array = ("abao", "ab") 34 ## Output: 0 35 # 36 ## Example 4 37 ## 38 ## Input: @array = ("abab", "abab") 39 ## Output: 1 40 ## 41 ## $array[0], $array[1]: "abab" is a prefix and suffix of "abab" 42 # 43 ## Example 5 44 ## 45 ## Input: @array = ("ab", "abab", "ababab") 46 ## Output: 3 47 ## 48 ## $array[0], $array[1]: "ab" is a prefix and suffix of "abab" 49 ## $array[0], $array[2]: "ab" is a prefix and suffix of "ababab" 50 ## $array[1], $array[2]: "abab" is a prefix and suffix of "ababab" 51 # 52 ## Example 6 53 ## 54 ## Input: @array = ("abc", "def", "ghij") 55 ## Output: 0 56 # 57 ############################################################ 58 ## 59 ## discussion 60 ## 61 ############################################################ 62 # 63 # Per example 4, we only want each string once, so we need to make 64 # sure we don't see any duplicates. So we walk each index in the array, 65 # making sure we don't see any duplicate (by jumping to the next element 66 # if we saw the current one already). Then we walk each index again in 67 # an inside loop, this time skipping the current element itself, and 68 # then we count this inner element if the outer element is both a 69 # prefix and a postfix of the inner one. 70 71 use v5.36; 72 73 prefix_suffix("a", "aba", "ababa", "aa"); 74 prefix_suffix("pa", "papa", "ma", "mama"); 75 prefix_suffix("abao", "ab"); 76 prefix_suffix("abab", "abab"); 77 prefix_suffix("ab", "abab", "ababab"); 78 prefix_suffix("abc", "def", "ghij"); 79 80 sub prefix_suffix(@array) { 81 say "Input: (\"" . join("\", \"", @array) . "\)"; 82 my $count = 0; 83 my $seen = {}; 84 foreach my $i (0..$#array) { 85 next if $seen->{$array[$i]}++; 86 foreach my $j (0..$#array) { 87 next if $i == $j; 88 $count++ if $array[$j] =~ m/^$array[$i]/ && $array[$j] =~ m/$array[$i]$/; 89 } 90 } 91 say "Output: $count"; 92 }