Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

C++ Program To Remove Duplicates From A Given String

  • Last Updated : 11 Dec, 2021

Given a string S, the task is to remove all the duplicates in the given string. 
Below are the different methods to remove duplicates in a string.

METHOD 1 (Simple) 

C++




// CPP program to remove duplicate character
// from character array and print in sorted
// order
#include <bits/stdc++.h>
using namespace std;
  
char *removeDuplicate(char str[], int n)
{
   // Used as index in the modified string
   int index = 0;   
     
   // Traverse through all characters
   for (int i=0; i<n; i++) {
         
     // Check if str[i] is present before it  
     int j;  
     for (j=0; j<i; j++) 
        if (str[i] == str[j])
           break;
       
     // If not present, then add it to
     // result.
     if (j == i)
        str[index++] = str[i];
   }
     
   return str;
}
  
// Driver code
int main()
{
   char str[]= "geeksforgeeks";
   int n = sizeof(str) / sizeof(str[0]);
   cout << removeDuplicate(str, n);
   return 0;
}

Output:  

geksfor

Time Complexity : O(n * n) 
Auxiliary Space : O(1) 
Keeps order of elements the same as input. 

 

METHOD 2 (Use BST) 
use set which implements a self-balancing Binary Search Tree. 

C++




// CPP program to remove duplicate character
// from character array and print in sorted
// order
#include <bits/stdc++.h>
using namespace std;
  
char *removeDuplicate(char str[], int n)
{
    // create a set using string characters
    // excluding '�'
    set<char>s (str, str+n-1);
  
    // print content of the set
    int i = 0;
    for (auto x : s)
       str[i++] = x;
    str[i] = '�';
  
    return str;
}
  
// Driver code
int main()
{
   char str[]= "geeksforgeeks";
   int n = sizeof(str) / sizeof(str[0]);
   cout << removeDuplicate(str, n);
   return 0;
}

Output:  

  efgkors

Time Complexity: O(n Log n) 
Auxiliary Space: O(n)

Thanks to Anivesh Tiwari for suggesting this approach.

It does not keep the order of elements the same as the input but prints them in sorted order.

METHOD 3 (Use Sorting) 
Algorithm: 

  1) Sort the elements.
  2) Now in a loop, remove duplicates by comparing the 
      current character with previous character.
  3)  Remove extra characters at the end of the resultant string.

Example:  

Input string:  geeksforgeeks
1) Sort the characters
   eeeefggkkorss
2) Remove duplicates
    efgkorskkorss
3) Remove extra characters
     efgkors

Note that, this method doesn’t keep the original order of the input string. For example, if we are to remove duplicates for geeksforgeeks and keep the order of characters the same, then the output should be geksfor, but the above function returns efgkos. We can modify this method by storing the original order.

Implementation:  

C++




// C++ program to remove duplicates, the order of
// characters is not maintained in this program
#include<bits/stdc++.h>
using namespace std;
  
/* Function to remove duplicates in a sorted array */
char *removeDupsSorted(char *str)
{
    int res_ind = 1, ip_ind = 1;
  
    /* In place removal of duplicate characters*/
    while (*(str + ip_ind))
    {
        if (*(str + ip_ind) != *(str + ip_ind - 1))
        {
            *(str + res_ind) = *(str + ip_ind);
            res_ind++;
        }
        ip_ind++;
    }
  
    /* After above step string is efgkorskkorss.
       Removing extra kkorss after string*/
    *(str + res_ind) = '�';
  
    return str;
}
  
/* Function removes duplicate characters from the string
   This function work in-place and fills null characters
   in the extra space left */
char *removeDups(char *str)
{
   int n = strlen(str);
  
   // Sort the character array
   sort(str, str+n);
  
   // Remove duplicates from sorted
   return removeDupsSorted(str);
}
  
/* Driver program to test removeDups */
int main()
{
  char str[] = "geeksforgeeks";
  cout << removeDups(str);
  return 0;
}

Output:  

efgkors

Time Complexity: O(n log n) If we use some nlogn sorting algorithm instead of quicksort.

Auxiliary Space: O(1)

METHOD 4 (Use Hashing ) 

Algorithm:  

1: Initialize:
    str  =  "test string" /* input string */
    ip_ind =  0          /* index to  keep track of location of next
                             character in input string */
    res_ind  =  0         /* index to  keep track of location of
                            next character in the resultant string */
    bin_hash[0..255] = {0,0, ….} /* Binary hash to see if character is 
                                        already processed or not */
2: Do following for each character *(str + ip_ind) in input string:
              (a) if bin_hash is not set for *(str + ip_ind) then
                   // if program sees the character *(str + ip_ind) first time
                         (i)  Set bin_hash for *(str + ip_ind)
                         (ii)  Move *(str  + ip_ind) to the resultant string.
                              This is done in-place.
                         (iii) res_ind++
              (b) ip_ind++
  /* String obtained after this step is "te stringing" */
3: Remove extra characters at the end of the resultant string.
  /*  String obtained after this step is "te string" */

Implementation:  

C++




#include <bits/stdc++.h>
using namespace std; 
# define NO_OF_CHARS 256 
# define bool int 
  
/* Function removes duplicate characters from the string 
This function work in-place and fills null characters 
in the extra space left */
char *removeDups(char str[]) 
    bool bin_hash[NO_OF_CHARS] = {0}; 
    int ip_ind = 0, res_ind = 0; 
    char temp; 
      
    /* In place removal of duplicate characters*/
    while (*(str + ip_ind)) 
    
        temp = *(str + ip_ind); 
        if (bin_hash[temp] == 0) 
        
            bin_hash[temp] = 1; 
            *(str + res_ind) = *(str + ip_ind); 
            res_ind++; 
        
        ip_ind++; 
    
      
    /* After above step string is stringiittg. 
        Removing extra iittg after string*/
    *(str+res_ind) = '�'
      
    return str; 
  
/* Driver code */
int main() 
    char str[] = "geeksforgeeks"
    cout << removeDups(str); 
    return 0; 
  
// This code is contributed by rathbhupendra

Output:  

geksfor

Time Complexity: O(n)

Important Points:  

  • Method 2 doesn’t maintain the characters as original strings, but method 4 does.
  • It is assumed that the number of possible characters in the input string is 256. NO_OF_CHARS should be changed accordingly.
  • calloc() is used instead of malloc() for memory allocations of a counting array (count) to initialize allocated memory to ‘�’. the malloc() followed by memset() could also be used.
  • The above algorithm also works for integer array inputs if the range of the integers in the array is given. An example problem is to find the maximum occurring number in an input array given that the input array contains integers only between 1000 to 1100

Method 5 (Using IndexOf() method) : 
Prerequisite : Java IndexOf() method  

C++




// C++ program to create a unique string
#include <bits/stdc++.h>
using namespace std;
  
// Function to make the string unique
string unique(string s)
{
    string str;
    int len = s.length();
  
    // loop to traverse the string and
    // check for repeating chars using
    // IndexOf() method in Java
    for(int i = 0; i < len; i++)
    {
          
        // character at i'th index of s
        char c = s[i];
  
        // If c is present in str, it returns
        // the index of c, else it returns npos
        auto found = str.find(c);
        if (found == std::string::npos) 
        {
              
            // Adding c to str if npos is returned
            str += c;
        }
    }
    return str;
}
  
// Driver code
int main()
{
      
    // Input string with repeating chars
    string s = "geeksforgeeks";
  
    cout << unique(s) << endl;
}
  
// This code is contributed by nirajgusain5

Output:  

geksfor

Thanks debjitdbb for suggesting this approach.
 

Method 6 (Using unordered_map STL method) : 
Prerequisite : unordered_map STL C++ method  

C++




// C++ program to create a unique string using unordered_map
  
/* access time in unordered_map on is O(1) generally if no collisions occur 
and therefore it helps us check if an element exists in a string in O(1) 
time complexity with constant space. */
  
#include <bits/stdc++.h> 
using namespace std; 
char* removeDuplicates(char *s,int n){
  unordered_map<char,int> exists;
  int index = 0; 
  for(int i=0;i<n;i++){
    if(exists[s[i]]==0)
    {
      s[index++] = s[i];
      exists[s[i]]++;
    }
  }
  return s;
}
  
//driver code
int main(){
  char s[] = "geeksforgeeks";
  int n = sizeof(s)/sizeof(s[0]);
  cout<<removeDuplicates(s,n)<<endl;
  return 0;
}

Output:  

geksfor

Time Complexity : O(n) 
Auxiliary Space : O(n)
Thanks, Allen James Vinoy for suggesting this approach.
 

Please refer complete article on Remove duplicates from a given string for more details!


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!