Suppose we have a list of contacts holding username, email and phone number in any order, we have to find the same contacts (When same person have many different contacts) and return the same contacts together. We have to keep in mind that −
A contact can store username, email and phone fields according to any order.
Two contacts are same if they have either same username or same email or same phone number.
So, if the input is like Contacts = [{"Amal", "[email protected]", "+915264"},{ "Bimal", "[email protected]", "+1234567"},{ "Amal123", "+1234567", "[email protected]"},{ "AmalAnother", "+962547", "[email protected]"}], then the output will be [0,2,3], [1] as contacts at index [0,2,3] are same, and another contact at index 1.
To solve this, we will follow these steps −
Define a function generate_graph() . This will take cnt, n, matrix
for i in range 0 to n, do
for j in range 0 to n, do
matrix[i, j] := 0
for i in range 0 to n, do
for j in range i + 1 to n, do
if cnt[i].slot1 is same as cnt[j].slot1 or cnt[i].slot1 is same as cnt[j].slot2 or cnt[i].slot1 is same as cnt[j].slot3 or cnt[i].slot2 is same as cnt[j].slot1 or cnt[i].slot2 is same as cnt[j].slot2 or cnt[i].slot2 is same as cnt[j].slot3 or cnt[i].slot3 is same as cnt[j].slot1 or cnt[i].slot3 is same as cnt[j].slot2 or cnt[i].slot3 is same as cnt[j].slot3, then
matrix[i, j] := 1
matrix[j, i] := 1
come out from the loop
Define a function visit_using_dfs() . This will take i, matrix, visited, sol, n
visited[i] := True
insert i at the end of sol
for j in range 0 to n, do
if matrix[i][j] is non-zero and not visited[j] is non-zero, then
visit_using_dfs(j, matrix, visited, sol, n)
From the main method, do the following −
n := size of cnt
sol := a new list
matrix := make a square matrix of size n x n
visited := make an array of size n, and fill with 0
generate_graph(cnt, n, matrix)
for i in range 0 to n, do
if not visited[i] is non-zero, then
visit_using_dfs(i, matrix, visited, sol, n)
insert -1 at the end of sol
for i in range 0 to size of sol, do
if sol[i] is same as -1, then
go to the next line
otherwise,
display sol[i]
Example
Let us see the following implementation to get better understanding −
class contact: def __init__(self, slot1, slot2, slot3): self.slot1 = slot1 self.slot2 = slot2 self.slot3 = slot3 def generate_graph(cnt, n, matrix): for i in range(n): for j in range(n): matrix[i][j] = 0 for i in range(n): for j in range(i + 1, n): if (cnt[i].slot1 == cnt[j].slot1 or cnt[i].slot1 == cnt[j].slot2 or cnt[i].slot1 == cnt[j].slot3 or cnt[i].slot2 == cnt[j].slot1 or cnt[i].slot2 == cnt[j].slot2 or cnt[i].slot2 == cnt[j].slot3 or cnt[i].slot3 == cnt[j].slot1 or cnt[i].slot3 == cnt[j].slot2 or cnt[i].slot3 == cnt[j].slot3): matrix[i][j] = 1 matrix[j][i] = 1 break def visit_using_dfs(i, matrix, visited, sol, n): visited[i] = True sol.append(i) for j in range(n): if (matrix[i][j] and not visited[j]): visit_using_dfs(j, matrix, visited, sol, n) def get_similar_contacts(cnt): n = len(cnt) sol = [] matrix = [[None] * n for i in range(n)] visited = [0] * n generate_graph(cnt, n, matrix) for i in range(n): if (not visited[i]): visit_using_dfs(i, matrix, visited, sol, n) sol.append(-1) for i in range(len(sol)): if (sol[i] == -1): print() else: print(sol[i], end = " ") cnt = [contact("Amal", "[email protected]", "+915264"), contact("Bimal", "[email protected]", "+1234567"), contact("Amal123", "+915264", "[email protected]"), contact("AmalAnother", "+962547", "[email protected]")] get_similar_contacts(cnt)
Input
cnt = [contact("Amal", "[email protected]", "+915264"), contact("Bimal", "[email protected]", "+1234567"), contact("Amal123", "+915264", "[email protected]"), contact("AmalAnother", "+962547", "[email protected]")]
Output
0 2 3 1