Given a string s which may contain lowercase and uppercase characters. Remove all the duplicate characters from the string and find the resultant string.
Note: The order of remaining characters in the output should be the same as in the original string.
Example:
Input: s = "geEksforGEeks"
Output: "geEksforG"
Explanation: After removing duplicate characters such as E, e, k, s, we have string as "geEksforG".Input: s = "HaPpyNewYear"
Output: "HaPpyNewYr"
Explanation: After removing duplicate characters such as e, a, we have string as "HaPpyNewYr".
Table of Content
[Naive Approach] Nested Loops - O(n^2) Time O(1) Space
We mainly use two nested loops.
Iterate through the string and for each character check the following using an inner loop.
- If current character has occurred before, ignore it.
- If not, add the character to the result.
#include <iostream>
#include <string>
using namespace std;
string removeDuplicates(string &s)
{
int index = 0;
// Traverse through all characters
for (int i = 0; i < s.size(); i++)
{
int j;
// Check if s[i] is present before it
for (j = 0; j < i; j++)
{
if (s[i] == s[j])
break;
}
// If not present, add it to result
if (j == i)
s[index++] = s[i];
}
// Resize string to remove extra characters
s.resize(index);
return s;
}
// Driver code
int main()
{
string s = "geEksforGEeks";
cout << removeDuplicates(s);
return 0;
}
#include <stdio.h>
#include <string.h>
char* removeDuplicates(char* s)
{
int index = 0;
// Traverse through all characters
for (int i = 0; i < strlen(s); i++)
{
int j;
// Check if s[i] is present before it
for (j = 0; j < i; j++)
{
if (s[i] == s[j])
break;
}
// If not present, add it to result
if (j == i)
s[index++] = s[i];
}
s[index] = '\0';
return s;
}
int main()
{
char s[] = "geEksforGEeks";
printf("%s", removeDuplicates(s));
return 0;
}
public class GFG {
public static String removeDuplicates(String s) {
int index = 0;
char[] charArray = s.toCharArray();
// Traverse through all characters
for (int i = 0; i < s.length(); i++) {
int j;
// Check if s[i] is present before it
for (j = 0; j < i; j++) {
if (s.charAt(i) == s.charAt(j))
break;
}
// If not present, add it to result
if (j == i)
charArray[index++] = s.charAt(i);
}
return new String(charArray, 0, index);
}
public static void main(String[] args) {
String s = "geEksforGEeks";
System.out.println(removeDuplicates(s));
}
}
def removeDuplicates(s):
index = 0
s = list(s)
# Traverse through all characters
for i in range(len(s)):
j = 0
# Check if s[i] is present before it
while j < i:
if s[i] == s[j]:
break
j += 1
# If not present, add it to result
if j == i:
s[index] = s[i]
index += 1
return ''.join(s[:index])
# Driver code
s = "geEksforGEeks"
print(removeDuplicates(s))
using System;
public class GFG
{
public static string removeDuplicates(string s)
{
int index = 0;
char[] charArray = s.ToCharArray();
// Traverse through all characters
for (int i = 0; i < s.Length; i++)
{
int j;
// Check if s[i] is present before it
for (j = 0; j < i; j++)
{
if (s[i] == s[j])
break;
}
// If not present, add it to result
if (j == i)
charArray[index++] = s[i];
}
return new string(charArray, 0, index);
}
public static void Main()
{
string s = "geEksforGEeks";
Console.WriteLine(removeDuplicates(s));
}
}
function removeDuplicates(s) {
let index = 0;
s = s.split('')
// Traverse through all characters
for (let i = 0; i < s.length; i++) {
let j = 0;
// Check if s[i] is present before it
while (j < i) {
if (s[i] === s[j]) {
break;
}
j += 1;
}
// If not present, add it to result
if (j === i) {
s[index] = s[i];
index += 1;
}
}
return s.slice(0, index).join('');
}
// Driver code
s = "geEksforGEeks";
console.log(removeDuplicates(s));
Output
geEksforG
[Expected Approach] Hash Set - O(n) Time O(1) Space
The Idea is to use a hash set to track seen characters while traversing the string.
- If a character is not in the set, add it to the result.
- Otherwise, skip it.
Algorithm:
- Create an empty hash set to store visited characters.
- Initialize an empty string ans to store the result.
- Traverse the input string character by character.
- For each character, check if it is present in the set.
- If not present, append it to ans and insert it into the set.
- Otherwise, skip the character.
- Return the final string ans containing unique characters.
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
// Function to remove duplicate characters
// User function template for C++
string removeDuplicates(string &s)
{
unordered_set<char> exists;
string ans = "";
// Traverse through the string
for (char c : s)
{
// If character is not found in set, add it
if (exists.find(c) == exists.end())
{
ans.push_back(c);
exists.insert(c);
}
}
return ans;
}
int main()
{
string s = "geEksforGEeks";
cout << removeDuplicates(s) << endl;
return 0;
}
import java.util.HashSet;
// Function to remove duplicate characters
// User function template for Java
public class GfG {
public static String removeDuplicates(String s) {
HashSet<Character> exists = new HashSet<>();
StringBuilder ans = new StringBuilder();
// Traverse through the string
for (char c : s.toCharArray()) {
// If character is not found in set, add it
if (!exists.contains(c)) {
ans.append(c);
exists.add(c);
}
}
return ans.toString();
}
public static void main(String[] args) {
String s = "geEksforGEeks";
System.out.println(removeDuplicates(s));
}
}
# Function to remove duplicate characters
# User function template for Python
def removeDuplicates(s):
exists = set()
ans = ""
# Traverse through the string
for c in s:
# If character is not found in set, add it
if c not in exists:
ans += c
exists.add(c)
return ans
if __name__ == "__main__":
s = "geEksforGEeks"
print(removeDuplicates(s))
using System;
using System.Collections.Generic;
// Function to remove duplicate characters
// User function template for C#
public class GFG
{
public static string removeDuplicates(string s)
{
HashSet<char> exists = new HashSet<char>();
string ans = "";
// Traverse through the string
foreach (char c in s)
{
// If character is not found in set, add it
if (!exists.Contains(c))
{
ans += c;
exists.Add(c);
}
}
return ans;
}
public static void Main()
{
string s = "geEksforGEeks";
Console.WriteLine(removeDuplicates(s));
}
}
// Function to remove duplicate characters
// User function template for JavaScript
function removeDuplicates(s) {
let exists = new Set();
let ans = '';
// Traverse through the string
for (let c of s) {
// If character is not found in set, add it
if (!exists.has(c)) {
ans += c;
exists.add(c);
}
}
return ans;
}
// Driver code
let s = 'geEksforGEeks';
console.log(removeDuplicates(s));
Output
geEksforG
[Alternate Approach] Frequency Array - O(n) Time O(1) Space
The idea is to use a frequency array to track visited characters. While traversing the string,
- Add a character to the result only if its frequency is 0.
- Otherwise skip it.
This keeps characters unique and preserves order.
Algorithm:
- Create a frequency array of size 256 initialized with 0.
- Initialize an empty string ans to store the result.
- Traverse the input string character by character.
- For each character, check its frequency in the array.
- If the frequency is 0, append it to ans and mark it as visited by setting it to 1.
- Otherwise, skip the character.
- Return the final string ans containing unique characters.
#include <iostream>
#include <string>
using namespace std;
string removeDuplicates(string &s)
{
// Create an integer array to store
// frequency for ASCII characters
vector<int> ch(256, 0);
// Create result string
string ans = "";
// Traverse the input string
for (char c : s) {
// Check if current character's frequency is 0
if (ch[c] == 0) {
// Add char if frequency is 0
ans.push_back(c);
// Increment frequency
ch[c]++;
}
}
return ans;
}
int main()
{
string s = "geEksforGEeks";
cout << removeDuplicates(s) << endl;
return 0;
}
#include <stdio.h>
#include <string.h>
char* removeDuplicates(char* s) {
// Create an integer array to store
// frequency for ASCII characters
int ch[256] = { 0 };
int index = 0;
int length = strlen(s);
// Traverse the input string
for (int i = 0; i < length; i++) {
char c = s[i];
// Check if current character's frequency is 0
if (ch[(unsigned char)c] == 0) {
// Add char if frequency is 0
s[index++] = c;
// Increment frequency
ch[(unsigned char)c]++;
}
}
s[index] = '\0'; // Null-terminate the result string
return s;
}
int main() {
char s[] = "geEksforGEeks";
printf("%s\n", removeDuplicates(s));
return 0;
}
import java.util.Arrays;
public class GFG {
public static String removeDuplicates(String s) {
// Create an integer array to store
// frequency for ASCII characters
int[] ch = new int[256];
StringBuilder ans = new StringBuilder();
// Traverse the input string
for (char c : s.toCharArray()) {
// Check if current character's frequency is 0
if (ch[c] == 0) {
// Add char if frequency is 0
ans.append(c);
// Increment frequency
ch[c]++;
}
}
return ans.toString();
}
public static void main(String[] args) {
String s = "geEksforGEeks";
System.out.println(removeDuplicates(s));
}
}
def removeDuplicates(s):
# Function to remove duplicate characters
# Create a list to store frequency for ASCII characters
ch = [0] * 256
result = []
# Traverse the input string
for char in s:
# Check if current character's frequency is 0
if ch[ord(char)] == 0:
# Add char if frequency is 0
result.append(char)
# Increment frequency
ch[ord(char)] += 1
return ''.join(result)
if __name__ == "__main__":
s = "geEksforGEeks"
print(removeDuplicates(s))
using System;
public class GFG {
public static string removeDuplicates(string s) {
// Create an integer array to store
// frequency for ASCII characters
int[] ch = new int[256];
System.Text.StringBuilder ans = new System.Text.StringBuilder();
// Traverse the input string
foreach (char c in s) {
// Check if current character's frequency is 0
if (ch[c] == 0) {
// Add char if frequency is 0
ans.Append(c);
// Increment frequency
ch[c]++;
}
}
return ans.ToString();
}
public static void Main() {
string s = "geEksforGEeks";
Console.WriteLine(removeDuplicates(s));
}
}
function removeDuplicates(s) {
// Function to remove duplicate characters
// Create an integer array to store
// frequency for ASCII characters
let ch = new Array(256).fill(0);
let result = '';
// Traverse the input string
for (let char of s) {
// Check if current character's frequency is 0
if (ch[char.charCodeAt(0)] === 0) {
// Add char if frequency is 0
result += char;
// Increment frequency
ch[char.charCodeAt(0)]++;
}
}
return result;
}
// Driver code
let s = "geEksforGEeks";
console.log(removeDuplicates(s));
Output
geEksforG