
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Lexicographically Smallest Equivalent String in C++
Suppose we have strings A and B of the same length, now we can say A[i] and B[i] are equivalent characters. So for example, if A = "abc" and B = "cde", then we have 'a' = 'c', 'b' = 'd' and 'c' = 'e'. The equivalent characters follow the usual rules of any equivalence relation:
Reflexivity: 'a' = 'a'
Symmetry: 'a' = 'b' implies 'b' = 'a'
Transitivity: 'a' = 'b' and 'b' = 'c' implies 'a' = 'c'
Now for example, given the equivalency information from A and B above, S = "eed", "acd", and "aab" are equivalent strings, and "aab" is the lexicographically smallest equivalent string of S. Here we have to find the lexicographically smallest equivalent string of S by using the equivalency information from A and B. Return all words that can be formed in this manner, in lexicographical order.
So if the input is like A = “parker”, B = “morris” and S = “parser”, then the output will be “makkek”. This is because based on the equivalency information in A and B, we can group their characters as [m,p], [a,o], [k,r,s], [e,i]. So the characters in each group are equivalent and sorted in lexicographical order. So the answer is "makkek".
To solve this, we will follow these steps −
Create an array called parent
Define a method called getParent(), this will take character x
if parent[x – ASCII of ‘a’] is -1, then return x – ASCII of ‘a’
parent[x – ASCII of ’a’] := getParent(ASCII of ‘a’ + parent[x – ASCII of ‘a’])
return parent[x – ASCII of ’a’]
Create another method called union(), this takes a and b
parentA := getParent(a), and parent := getParent(b)
so if parentA = parent, then return otherwise when parentA < parent, then parent[parentB] := parentA, and otherwise parent[parentA] := parent
From the main method, do the following −
set parent := an array of size 26 and fill this using -1
-
for i in range 0 to 25
perform union(A[i], B[i])
create one blank string ret
-
for i in range 0 to size of S
ret := ret + getParent(S[i]) + ‘a’
return ret
Let us see the following implementation to get better understanding −
Example
#include <bits/stdc++.h> using namespace std; class Solution { public: vector <int> parent; int getParent(char x){ //cout << x << "-- " << x-'a' << endl; if(parent[x - 'a'] == -1) return x - 'a'; return parent[x - 'a'] = getParent('a' + parent[x - 'a']); } void unionn(char a, char b){ int parentA = getParent(a); int parentB = getParent(b); if(parentA == parentB) return; if(parentA < parentB){ parent[parentB] = parentA; }else{ parent[parentA] = parentB; } } string smallestEquivalentString(string A, string B, string S) { parent = vector <int>(26, -1); for(int i = 0; i < A.size(); i++){ unionn(A[i], B[i]); } string ret = ""; for(int i = 0; i < S.size(); i++){ ret += getParent(S[i]) + 'a'; } return ret; } }; main(){ Solution ob; cout << (ob.smallestEquivalentString("parker","morris","parser")); }
Input
"parker" "morris" "parser"
Output
makkek