# ETOOBUSY š minimal blogging for the impatient

# PWC092 - Isomorphic Strings

**TL;DR**

Here we are with TASK #1 from the Perl Weekly Challenge #092. Enjoy!

# The challenge

You are given two strings

`$A`

and`$B`

. Write a script to check if the given strings are Isomorphic. Print 1 if they are otherwise 0.

# The questions

I guess that there are few *interview questions* here, apart from basic ones
dealing with weird inputs like undefined values.

# The solution

The fun thing is that the definition is explained in an article that also
provides a solution. Looking at it *after* coding the solution below, I
realized that the solutions are pretty similar, with the difference that Iām
using a hash where that solution uses a set becauseā¦ itās so easy to use a
hash in Perl ā¤ļø

```
sub isomorphic_strings ($A, $B) {
return 0 if length($A) != length($B);
my (%A_for, %B_for);
for my $i (0 .. length($A) - 1) {
my ($cA, $cB) = map { substr $_, $i, 1 } ($A, $B);
return 0
if (exists($B_for{$cA}) && ($B_for{$cA} ne $cB))
|| (exists($A_for{$cB}) && ($A_for{$cB} ne $cA));
$B_for{$A_for{$cB} = $cA} = $cB;
} ## end for my $i (0 .. length(...))
return 1;
} ## end sub isomorphic_strings
```

The trivial case where the two strings might have different lenghts is addressed at the beginning and forgot afterwards.

In the main loop, we check character pair by character pair, making sure that there is always a single, unique bidirectional mapping between pairs. Whenever we hit a deviation we return immediately with a failure (0). If we make it to the endā¦ then itās a 1!

From an implementation perspective, I can acknowledge that the solution in
Isomorphic uses the ābare minimumā of data structures to keep complexity
low; on the other hand, I think that the *double-map* solution with two
hashes like the one above might be a bit clearer to read some time after,
because of the symmetry in the problem itself.

As it often happens, though, maybe itās just a matter of taste š

*Comments? Octodon, Twitter, GitHub, Reddit, or drop me a line!*