Beautiful Pairs

  • + 0 comments

    Exhaustively, this problem can be considered in two cases

    1. A and B are similar. That is, for each item in A, there exists an item in B and there is no unmatched item in A. This directly implies vice-versa. In this case then, you will have to change something in B to something that's not in A. So you count no of paired items and reduce one.

    2. A and B are not similar. That is, there is at least one item in A that doesn't have its correponding pair in B which also implies vice-versa. In this case, you can change any one of those unmatched items in B back to something that already exists in A. So you count no of paired items and add one.

    Here is python3 solution. I must add this is not a greedy problem at all. A greedy approach requires making optimal choice at each pass of your solution.

    def beautifulPairs(A, B):
        # Write your code here
        
        freq_A = Counter(A) # build a frequency dictionary
        
        paired = 0
        for i in B:
            if freq_A[i] > 0:
                paired += 1
                freq_A[i] -= 1
                
        common = freq_A.most_common(1)[0] #returns a tuple 
        
        if common[1] > 0:   #at least one unmatched item in A
            return paired + 1
        else:               # A and B are similar
            return paired - 1