760 Find Anagram Mappings

Given two listsAandB, andBis an anagram ofA.Bis an anagram ofAmeansBis made by randomizing the order of the elements inA.

We want to find anindex mappingP, fromAtoB. A mappingP[i] = jmeans theith element inAappears inBat indexj.

These listsAandBmay contain duplicates. If there are multiple answers, output any of them.

For example, given

A = [12, 28, 46, 32, 50]
B = [50, 12, 32, 46, 28]

We should return

[1, 4, 3, 2, 0]

as P[0] = 1 because the 0th element of A appears at B[1], and P[1] = 4 because the 1st element of A appears at B[4], and so on.

Note:

  1. A, B have equal lengths in range [1, 100].

  2. A[i], B[i] are integers in range [0, 10^5].

The Idea: Map the indices of B into a list. Then iterate through A and build a new list P that take the corresponding index of B that is mapped from a key of A. We solve the problem of duplicates by mapping to a list of elements, and simply taking the last one (as order does not pattern).

Complexity: O(N) time and space

import collections


class Solution:
    def anagramMappings(self, A, B):
        """
        :type A: List[int]
        :type B: List[int]
        :rtype: List[int]
        """

        B_map = collections.defaultdict(list)
        for i, b in enumerate(B):
            B_map[b].append(i)

        P = []
        for a in A:
            P.append(B_map[a].pop())

        return P

Last updated