Find uncommon characters of the two strings

24 Jun, 2022
Find and print the uncommon characters of the two given strings in sorted order. Here uncommon character means that either the character is present in one string or it is present in other string but not in both. The strings contain only lowercase characters and can contain duplicates. Source: Amazon Interview Experience | Set 355 (For 1 Year Experienced)Examples:  
Input: str1 = “characters”, str2 = “alphabets” Output: b c l p rInput: str1 = “geeksforgeeks”, str2 = “geeksquiz” Output: f i o q r u z
 
Naive Approach: Using two loops, for each character of 1st string check whether it is present in the 2nd string or not. Likewise, for each character of 2nd string check whether it is present in the 1st string or not.Time Complexity: O(n^2) and extra would be required to handle duplicates.Efficient Approach: An efficient approach is to use hashing.  
Use a hash table of size 26 for all the lowercase characters.
Initially, mark presence of each character as ‘0’ (denoting that the character is not present in both the strings).
Traverse the 1st string and mark presence of each character of 1st string as ‘1’ (denoting 1st string) in the hash table.
Now, traverse the 2nd string. For each character of 2nd string, check whether its presence in the hash table is ‘1’ or not. If it is ‘1’, then mark its presence as ‘-1’ (denoting that the character is common to both the strings), else mark its presence as ‘2’ (denoting 2nd string).
Below image is a dry run of the above approach: 
Below is the implementation of the above approach: 
C++
Java
Python 3
C#
Javascript
// C++ implementation to find the uncommon// characters of the two strings#include <bits/stdc++.h>using namespace std; // size of the hash tableconst int MAX_CHAR = 26; // function to find the uncommon characters// of the two stringsvoid findAndPrintUncommonChars(string str1, string str2){    // mark presence of each character as 0    // in the hash table 'present[]'    int present[MAX_CHAR];    for (int i=0; i<MAX_CHAR; i++)        present[i] = 0;     int l1 = str1.size();    int l2 = str2.size();     // for each character of str1, mark its    // presence as 1 in 'present[]'    for (int i=0; i<l1; i++)        present[str1[i] - 'a'] = 1;     // for each character of str2    for (int i=0; i<l2; i++)    {        // if a character of str2 is also present        // in str1, then mark its presence as -1        if (present[str2[i] - 'a'] == 1            || present[str2[i] - 'a'] == -1)            present[str2[i] - 'a'] = -1;         // else mark its presence as 2        else            present[str2[i] - 'a'] = 2;    }     // print all the uncommon characters    for (int i=0; i<MAX_CHAR; i++)        if (present[i] == 1 || present[i] == 2 )            cout << (char(i + 'a')) << " ";} // Driver program to test aboveint main(){    string str1 = "characters";    string str2 = "alphabets";    findAndPrintUncommonChars(str1, str2);    return 0;}
// Java implementation to find the uncommon// characters of the two stringsclass GFG{     // size of the hash table    static int MAX_CHAR = 26;     // function to find the uncommon    // characters of the two strings    static void findAndPrintUncommonChars(String str1,                                       String str2)    {        // mark presence of each character as 0        // in the hash table 'present[]'        int present[] = new int[MAX_CHAR];        for (int i = 0; i < MAX_CHAR; i++)        {            present[i] = 0;        }         int l1 = str1.length();        int l2 = str2.length();         // for each character of str1, mark its        // presence as 1 in 'present[]'        for (int i = 0; i < l1; i++)        {            present[str1.charAt(i) - 'a'] = 1;        }         // for each character of str2        for (int i = 0; i < l2; i++)        {                         // if a character of str2 is also present            // in str1, then mark its presence as -1            if (present[str2.charAt(i) - 'a'] == 1                || present[str2.charAt(i) - 'a'] == -1)            {                present[str2.charAt(i) - 'a'] = -1;            }                         // else mark its presence as 2            else            {                present[str2.charAt(i) - 'a'] = 2;            }        }         // print all the uncommon characters        for (int i = 0; i < MAX_CHAR; i++)        {            if (present[i] == 1 || present[i] == 2)            {                System.out.print((char) (i + 'a') + " ");            }        }    }     // Driver code    public static void main(String[] args)    {        String str1 = "characters";        String str2 = "alphabets";        findAndPrintUncommonChars(str1, str2);    }} // This code is contributed by Rajput-JI
# Python 3 implementation to find the# uncommon characters of the two strings # size of the hash tableMAX_CHAR = 26 # function to find the uncommon characters# of the two stringsdef findAndPrintUncommonChars(str1, str2):         # mark presence of each character as 0    # in the hash table 'present[]'    present = [0] * MAX_CHAR    for i in range(0, MAX_CHAR):        present[i] = 0     l1 = len(str1)    l2 = len(str2)         # for each character of str1, mark its    # presence as 1 in 'present[]'    for i in range(0, l1):        present[ord(str1[i]) - ord('a')] = 1             # for each character of str2    for i in range(0, l2):                 # if a character of str2 is also present        # in str1, then mark its presence as -1        if(present[ord(str2[i]) - ord('a')] == 1 or           present[ord(str2[i]) - ord('a')] == -1):            present[ord(str2[i]) - ord('a')] = -1         # else mark its presence as 2        else:            present[ord(str2[i]) - ord('a')] = 2     # print all the uncommon characters    for i in range(0, MAX_CHAR):        if(present[i] == 1 or present[i] == 2):            print(chr(i + ord('a')), end = " ") # Driver Codeif __name__ == "__main__":    str1 = "characters"    str2 = "alphabets"    findAndPrintUncommonChars(str1, str2) # This code is contributed# by Sairahul099
// C# implementation to find the uncommon// characters of the two stringsusing System; class GFG{     // size of the hash table    static int MAX_CHAR = 26;     // function to find the uncommon    // characters of the two strings    static void findAndPrintUncommonChars(String str1,                                    String str2)    {        // mark presence of each character as 0        // in the hash table 'present[]'        int []present = new int[MAX_CHAR];        for (int i = 0; i < MAX_CHAR; i++)        {            present[i] = 0;        }         int l1 = str1.Length;        int l2 = str2.Length;         // for each character of str1, mark its        // presence as 1 in 'present[]'        for (int i = 0; i < l1; i++)        {            present[str1[i] - 'a'] = 1;        }         // for each character of str2        for (int i = 0; i < l2; i++)        {                         // if a character of str2 is also present            // in str1, then mark its presence as -1            if (present[str2[i] - 'a'] == 1                || present[str2[i] - 'a'] == -1)            {                present[str2[i] - 'a'] = -1;            }                         // else mark its presence as 2            else            {                present[str2[i] - 'a'] = 2;            }        }         // print all the uncommon characters        for (int i = 0; i < MAX_CHAR; i++)        {            if (present[i] == 1 || present[i] == 2)            {                Console.Write((char) (i + 'a') + " ");            }        }    }     // Driver code    public static void Main(String[] args)    {        String str1 = "characters";        String str2 = "alphabets";        findAndPrintUncommonChars(str1, str2);    }} // This code is contributed by PrinciRaj1992
<script>// Javascript implementation to find the uncommon// characters of the two strings // size of the hash tablevar MAX_CHAR = 26; // function to find the uncommon characters// of the two stringsfunction findAndPrintUncommonChars(str1, str2){    // mark presence of each character as 0    // in the hash table 'present[]'    var present = Array(MAX_CHAR);    for (var i = 0; i < MAX_CHAR; i++)        present[i] = 0;     var l1 = str1.length;    var l2 = str2.length;     // for each character of str1, mark its    // presence as 1 in 'present[]'    for (var i = 0; i < l1; i++)        present[str1[i].charCodeAt(0) - 'a'.charCodeAt(0)] = 1;     // for each character of str2    for (var i = 0; i < l2; i++)    {        // if a character of str2 is also present        // in str1, then mark its presence as -1        if (present[str2[i].charCodeAt(0) - 'a'.charCodeAt(0)] == 1            || present[str2[i].charCodeAt(0) - 'a'.charCodeAt(0)] == -1)            present[str2[i].charCodeAt(0) - 'a'.charCodeAt(0)] = -1;         // else mark its presence as 2        else            present[str2[i].charCodeAt(0) - 'a'.charCodeAt(0)] = 2;    }     // print all the uncommon characters    for (var i=0; i<MAX_CHAR; i++)        if (present[i] == 1 || present[i] == 2 )            document.write( (String.fromCharCode(i + 'a'.charCodeAt(0))) + " ");} // Driver program to test abovevar str1 = "characters";var str2 = "alphabets";findAndPrintUncommonChars(str1, str2); // This code is contributed by importantly.</script>
b c l p r 
Time Complexity: O(m + n), where m and n are the sizes of the two strings respectively.
Auxiliary Space: O(26), no any other extra space is required, so it is a constant.
This article is contributed by Ayush Jauhari. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Another map based approach:
Take two maps and initialize their value as 0. 
traverse the first string, for each character present in first string, set 1 in the 1st map.
Do the same for second string also.
Iterate through all 26 characters, if the xor of map 1 and map 2 is 1 then it is present in one of the string only. i.e those characters are uncommon characters. Add them in the result string.
return the result string, if the string is empty, return -1.
Below is the implementation of the above approach:
C++
Java
C#
#include<bits/stdc++.h>using namespace std; string UncommonChars(string a, string b){    int mp1[26] = {0}, mp2[26] = {0};    int n = a.size(), m = b.size();     for(auto &x: a){      mp1[x-'a'] = 1;    }     for(auto &x: b){      mp2[x-'a'] = 1;    }     string chars = "";     for(int i = 0; i < 26; ++i){      if(mp1[i]^mp2[i])        chars+=char(i+'a');    }    if(chars == "")      return "-1";    else      return chars;} int main(){    string a = "geeksforgeeks";    string b = "geeksquiz";    string result = UncommonChars(a,b);    cout << result << endl;    return 0;}
// Java implementation to find the uncommon// characters of the two stringsclass GFG {     // size of the hash table    static int MAX_CHAR = 26;     // function to find the uncommon    // characters of the two strings    static String UncommonChars(String a, String b)    {        int mp1[] = new int[MAX_CHAR];        int mp2[] = new int[MAX_CHAR];        int n = a.length();        int m = b.length();        for (int i = 0; i < n; i++) {            mp1[a.charAt(i) - 'a'] = 1;        }        for (int i = 0; i < m; i++) {            mp2[b.charAt(i) - 'a'] = 1;        }         String chars = "";        for (int i = 0; i < 26; i++) {            if ((mp1[i] ^ mp2[i]) != 0) {                chars += (char)(i + 'a');            }        }        if (chars == "")            return "-1";        else            return chars;    }     // Driver code    public static void main(String[] args)    {        String a = "geeksforgeeks";        String b = "geeksquiz";        String result = UncommonChars(a, b);        System.out.print(result);    }} // This code is contributed by Aarti_Rathi
using System; public static class GFG {  public static string UncommonChars(string a, string b)  {    int[] mp1 = new int[26];    int[] mp2 = new int[26];    int n = a.Length;    int m = b.Length;     foreach(var x in a) { mp1[x - 'a'] = 1; }     foreach(var x in b) { mp2[x - 'a'] = 1; }     string chars = "";     for (int i = 0; i < 26; ++i) {      if ((mp1[i] ^ mp2[i]) != 0) {        chars += (char)(i + 'a');      }    }    if (chars == "") {      return "-1";    }    else {      return chars;    }  }   public static void Main()  {    string a = "geeksforgeeks";    string b = "geeksquiz";    string result = UncommonChars(a, b);    Console.Write(result);    Console.Write("\n");  }} // This code is contributed by Aarti_Rathi
fioqruz
Time Complexity: O(m+n) Where m is the length of the first string and n is the length of second string.
Auxiliary Space: O(26), no any other extra space is required, so it is a constant.
This approach is contributed by Aarti_Rathi and Bibhash Ghosh.      
Sairahul Jella
Rajput-Ji
princiraj1992
gfg_sal_gfg
importantly
tranceispermanent
rkbhola5
samim2000
sachinvinod1904
Amazon
Hash
Strings
Amazon
Hash
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
What is Hashing | A Complete Tutorial
Longest Consecutive Subsequence
Sorting a Map by value in C++ STL
Find the smallest window in a string containing all characters of another string
Overview of Data Structures | Set 2 (Binary Tree, BST, Heap and Hash)
Write a program to reverse an array or string
Reverse a string in Java
Write a program to print all permutations of a given string
C++ Data Types
Check for Balanced Brackets in an expression (well-formedness) using Stack