Given an array arr of strings, the task is to remove the strings that are an anagram of an earlier string, then print the remaining array in sorted order.
Examples:
Input: arr[] = { "geeks", "keegs", "code", "doce" }, N = 4
Output: ["code", "geeks"]
Explanation:
"geeks" and "keegs" are anagrams, so we remove "keegs".
Similarly, "code" and "doce" are anagrams, so we remove "doce".Input : arr[] = {"tea", "ate", "anagram", "eat", "gramaan"}, N = 5
Output : ["anagram", "tea"]
Explanation: "ate" and "eat" are anagram of "tea".
"gramaan" is an anagram of "anagram" hence, array becomes ["anagram", "tea"].
Approach:
In order to check whether the given two strings are anagrams are not, we can simply sort both the strings and compare them. Also, to check if a string has occurred or not, we can use a HashSet.
Follow the below steps to implement the idea:
- Create an auxiliary array to keep the resultant strings, and HashSet to keep a track of the string that we have found so far.
- Then iterate through the given string of array, sort the current string and check if the string is present in the HashSet.
- If the current string is not found in the HashSet, then push arr[i] in the resultant array, and insert the sorted string in the HashSet.
- Finally, sort the resultant array and print each string.
Below is the implementation of the above approach.
// C++ implementation to remove
// all the anagram strings
#include <bits/stdc++.h>
using namespace std;
// Function to remove the anagram string
void removeAnagrams(string arr[], int N)
{
// vector to store the final result
vector<string> ans;
// data structure to keep a mark
// of the previously occurred string
unordered_set<string> found;
for (int i = 0; i < N; i++) {
string word = arr[i];
// Sort the characters
// of the current string
sort(begin(word), end(word));
// Check if current string is not
// present inside the hashmap
// Then push it in the resultant vector
// and insert it in the hashmap
if (found.find(word) == found.end()) {
ans.push_back(arr[i]);
found.insert(word);
}
}
// Sort the resultant vector of strings
sort(begin(ans), end(ans));
// Print the required array
for (int i = 0; i < ans.size(); ++i) {
cout << ans[i] << " ";
}
}
// Driver code
int main()
{
string arr[]
= { "geeks", "keegs",
"code", "doce" };
int N = 4;
removeAnagrams(arr, N);
return 0;
}
// Java implementation to remove
// all the anagram Strings
import java.util.*;
class GFG{
// Function to remove the anagram String
static void removeAnagrams(String arr[], int N)
{
// vector to store the final result
Vector<String> ans = new Vector<String>();
// data structure to keep a mark
// of the previously occurred String
HashSet<String> found = new HashSet<String> ();
for (int i = 0; i < N; i++) {
String word = arr[i];
// Sort the characters
// of the current String
word = sort(word);
// Check if current String is not
// present inside the hashmap
// Then push it in the resultant vector
// and insert it in the hashmap
if (!found.contains(word)) {
ans.add(arr[i]);
found.add(word);
}
}
// Sort the resultant vector of Strings
Collections.sort(ans);
// Print the required array
for (int i = 0; i < ans.size(); ++i) {
System.out.print(ans.get(i)+ " ");
}
}
static String sort(String inputString)
{
// convert input string to char array
char tempArray[] = inputString.toCharArray();
// sort tempArray
Arrays.sort(tempArray);
// return new sorted string
return new String(tempArray);
}
// Driver code
public static void main(String[] args)
{
String arr[]
= { "geeks", "keegs",
"code", "doce" };
int N = 4;
removeAnagrams(arr, N);
}
}
// This code is contributed by 29AjayKumar
# Python3 implementation to remove
# all the anagram strings
# Function to remove the anagram string
def removeAnagrams(arr, N):
# vector to store the final result
ans = []
# data structure to keep a mark
# of the previously occurred string
found = dict()
for i in range(N):
word = arr[i]
# Sort the characters
# of the current string
word = " ".join(sorted(word))
# Check if current is not
# present inside the hashmap
# Then push it in the resultant vector
# and insert it in the hashmap
if (word not in found):
ans.append(arr[i])
found[word] = 1
# Sort the resultant vector of strings
ans = sorted(ans)
# Print the required array
for i in range(len(ans)):
print(ans[i], end=" ")
# Driver code
if __name__ == '__main__':
arr=["geeks", "keegs","code", "doce"]
N = 4
removeAnagrams(arr, N)
# This code is contributed by mohit kumar 29
// C# implementation to remove
// all the anagram Strings
using System;
using System.Collections.Generic;
class GFG{
// Function to remove the anagram String
static void removeAnagrams(String []arr, int N)
{
// vector to store the readonly result
List<String> ans = new List<String>();
// data structure to keep a mark
// of the previously occurred String
HashSet<String> found = new HashSet<String> ();
for (int i = 0; i < N; i++) {
String word = arr[i];
// Sort the characters
// of the current String
word = sort(word);
// Check if current String is not
// present inside the hashmap
// Then push it in the resultant vector
// and insert it in the hashmap
if (!found.Contains(word)) {
ans.Add(arr[i]);
found.Add(word);
}
}
// Sort the resultant vector of Strings
ans.Sort();
// Print the required array
for (int i = 0; i < ans.Count; ++i) {
Console.Write(ans[i]+ " ");
}
}
static String sort(String inputString)
{
// convert input string to char array
char []tempArray = inputString.ToCharArray();
// sort tempArray
Array.Sort(tempArray);
// return new sorted string
return String.Join("",tempArray);
}
// Driver code
public static void Main(String[] args)
{
String []arr
= { "geeks", "keegs",
"code", "doce" };
int N = 4;
removeAnagrams(arr, N);
}
}
// This code is contributed by 29AjayKumar
<script>
// Javascript implementation to remove
// all the anagram Strings
// Function to remove the anagram String
function removeAnagrams(arr, N)
{
// Vector to store the final result
let ans = [];
// Data structure to keep a mark
// of the previously occurred String
let found = new Set();
for(let i = 0; i < N; i++)
{
let word = arr[i];
// Sort the characters
// of the current String
word = sort(word);
// Check if current String is not
// present inside the hashmap
// Then push it in the resultant vector
// and insert it in the hashmap
if (!found.has(word))
{
ans.push(arr[i]);
found.add(word);
}
}
// Sort the resultant vector of Strings
(ans).sort();
// Print the required array
for(let i = 0; i < ans.length; ++i)
{
document.write(ans[i] + " ");
}
}
function sort(inputString)
{
// Convert input string to char array
let tempArray = inputString.split("");
// Sort tempArray
(tempArray).sort();
// Return new sorted string
return (tempArray).join("");
}
// Driver code
let arr = [ "geeks", "keegs",
"code", "doce" ];
let N = 4;
removeAnagrams(arr, N);
// This code is contributed by unknown2108
</script>
Output
code geeks
Time Complexity: O(N * (M log M)) where N is the size of the array and m is the length of the word.
Auxiliary space: O(N).
Please suggest if someone has a better solution that is more efficient in terms of space and time.