Find possible bijection between characters and digits
I would use a set for this:
In [9]: set("aabbcc")
Out[9]: set(['a', 'c', 'b'])
In [10]: set(zip("aabbcc", [1, 1, 5, 5, 2, 2]))
Out[10]: set([('a', 1), ('c', 2), ('b', 5)])
The second set will have length equal to the first set if and only if the mapping is surjective. (if it is not, you will have two copies of a letter mapping to the same number in the second set, or vice versa)
Here is code that implements the idea
def is_bijection(seq1, seq2):
distinct1 = set(seq1)
distinct2 = set(seq2)
distinctMappings = set(zip(seq1, seq2))
return len(distinct1) == len(distinct2) == len(distinctMappings)
This will also return true if one sequence is shorter than the other, but a valid mapping has already been established. If the sequences must be the same length, you should add a check for that.