Python | Check possible bijection between sequence of characters and digits
Last Updated :
13 Apr, 2023
Given a string ‘char_seq'(sequence of characters) and a positive integer ‘dig_seq'(sequence of digits), Write a Python program to find possible bijection or one-one onto relationship between ‘char_seq’ and ‘dig_seq’ such that each character matches to one and only one digit.
Examples:
Input : char_seq = 'bxdyxb'
dig_seq = 123421
Output : True
Input : char_seq = 'bxdyxb'
dig_seq = 123321
Output : False
Method #1: Using zip method This method simply zips the ‘char_seq’ and ‘dig_seq’ and checks if corresponding digits and characters matches or not.
Python3
def is_bijection(char_seq, dig_seq):
z = zip ( str (char_seq), str (dig_seq))
res = all (
(z1[ 0 ] = = z2[ 0 ]) = = (z1[ 1 ] = = z2[ 1 ]) for z1 in z for z2 in z)
return res
char_seq = 'bxdyxb'
dig_seq = 123421
print (is_bijection(char_seq, dig_seq))
|
Method #2: Using itertools.groupby method This method uses the same approach with a slight difference, it uses itertools.groupby to match characters with digits.
Python3
import itertools
def is_bijection(char_seq, dig_seq):
z = sorted ( zip ( str (char_seq), str (dig_seq)))
res = all (gx = = gy
for k, g in itertools.groupby(z, key = lambda res: res[ 0 ])
for gx in g for gy in g)
return res
char_seq = 'bxdyxb'
dig_seq = 123421
print (is_bijection(char_seq, dig_seq))
|
Method #3: It works by iterating through the input sequences and creating a dictionary that maps characters to digits. For each character and digit pair, if the character is already in the dictionary and the digit does not match the one already mapped to the character, then the bijection is not valid and the function returns False. Otherwise, the character and digit are added to the dictionary. If the loop completes, then the bijection is valid and the function returns True.
Python3
def is_bijection(char_seq, dig_seq):
dig_seq = str (dig_seq)
char_dict = {}
for c, d in zip (char_seq, dig_seq):
if c in char_dict:
if char_dict ! = d:
return False
else :
char_dict = d
return True
char_seq = 'bxdyxb'
dig_seq = 123421
print (is_bijection(char_seq, dig_seq))
|
Time complexity: O(n) and
Auxiliary space: O(n), where n is the length of the input sequences.
Method #4: By repeatedly going through the input sequences, it builds a dictionary that converts characters to numbers. The bijection is invalid and the function returns False for any character and digit pair where the character is already present in the dictionary and the digit does not match the one previously mapped to the character. The character and digit are added to the vocabulary in all other cases. The bijection is true and the function returns True if the loop is finished.
Python
def is_bijection(char_seq, dig_seq):
dig_seq_str = str (dig_seq)
if len (char_seq) ! = len (dig_seq_str):
return False
char_to_dig = {}
dig_to_char = {}
for char, dig in zip (char_seq, dig_seq_str):
if char in char_to_dig and char_to_dig[char] ! = dig:
return False
if dig in dig_to_char and dig_to_char[dig] ! = char:
return False
char_to_dig[char] = dig
dig_to_char[dig] = char
return True
char_seq = 'bxdyxb'
dig_seq = 123421
print (is_bijection(char_seq, dig_seq))
|
Time Complexity : O(n)
Auxiliary Space: O(n)
Share your thoughts in the comments
Please Login to comment...