There is a list of items. Given a specific word, e.g., “sun”, print out all the items in list which contain all the characters of “sun”.
For example if the given word is “sun” and the items are “sunday”, “geeksforgeeks”, “utensils”, “”just” and “sss”, then the program should print “sunday” and “utensils”.
Algorithm: Thanks to geek4u for suggesting this algorithm.
1) Initialize a binary map:
map[256] = {0, 0, ..}
2) Set values in map[] for the given word "sun"
map['s'] = 1, map['u'] = 1, map['n'] = 1
3) Store length of the word "sun":
len = 3 for "sun"
4) Pick words (or items)one by one from the list
a) set count = 0;
b) For each character ch of the picked word
if(map['ch'] is set)
increment count and unset map['ch']
c) If count becomes equal to len (3 for "sun"),
print the currently picked word.
d) Set values in map[] for next list item
map['s'] = 1, map['u'] = 1, map['n'] = 1
C++
#include <bits/stdc++.h>
#include<stdio.h>
#include<string.h>
using namespace std;
# define NO_OF_CHARS 256
void print( char list[][50], char *word, int list_size)
{
int *map = new int [( sizeof ( int )*NO_OF_CHARS)];
int i, j, count, word_size;
for (i = 0; *(word+i); i++)
map[*(word + i)] = 1;
word_size = strlen (word);
for (i = 0; i < list_size; i++)
{
for (j = 0, count = 0; *(list[i] + j); j++)
{
if (map[*(list[i] + j)])
{
count++;
map[*(list[i] + j)] = 0;
}
}
if (count == word_size)
cout << list[i] << endl;
for (j = 0; *(word + j); j++)
map[*(word + j)] = 1;
}
}
int main()
{
char str[] = "sun" ;
char list[][50] = { "geeksforgeeks" , "unsorted" , "sunday" ,
"just" , "sss" };
print(list, str, 5);
return 0;
}
|
C
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define NO_OF_CHARS 256
void print( char *list[], char *word, int list_size)
{
int *map = ( int *) calloc ( sizeof ( int ), NO_OF_CHARS);
int i, j, count, word_size;
for (i = 0; *(word+i); i++)
map[*(word + i)] = 1;
word_size = strlen (word);
for (i = 0; i < list_size; i++)
{
for (j = 0, count = 0; *(list[i] + j); j++)
{
if (map[*(list[i] + j)])
{
count++;
map[*(list[i] + j)] = 0;
}
}
if (count == word_size)
printf ( "\n %s" , list[i]);
for (j = 0; *(word+j); j++)
map[*(word + j)] = 1;
}
}
int main()
{
char str[] = "sun" ;
char *list[] = { "geeksforgeeks" , "unsorted" , "sunday" ,
"just" , "sss" };
print(list, str, 5);
getchar ();
return 0;
}
|
Java
class GFG
{
static final int NO_OF_CHARS = 256 ;
static void print(String[] list, String word, int list_size)
{
int [] map = new int [NO_OF_CHARS];
int i, j, count, word_size;
for (i = 0 ; i < word.length(); i++)
map[word.charAt(i)] = 1 ;
word_size = word.length();
for (i = 0 ; i < list_size; i++)
{
for (j = 0 , count = 0 ; j < list[i].length(); j++)
{
if (map[list[i].charAt(j)] > 0 )
{
count++;
map[list[i].charAt(j)] = 0 ;
}
}
if (count == word_size)
System.out.println(list[i]);
for (j = 0 ; j < word.length(); j++)
map[word.charAt(j)] = 1 ;
}
}
public static void main(String[] args)
{
String str = "sun" ;
String[] list = { "geeksforgeeks" , "unsorted" ,
"sunday" , "just" , "sss" };
print(list, str, 5 );
}
}
|
Python
NO_OF_CHARS = 256
def printList( list , word, list_size):
map = [ 0 ] * NO_OF_CHARS
for i in word:
map [ ord (i)] = 1
word_size = len (word)
for i in list :
count = 0
for j in i:
if map [ ord (j)]:
count + = 1
map [ ord (j)] = 0
if count = = word_size:
print i
for j in xrange ( len (word)):
map [ ord (word[j])] = 1
string = "sun"
list = [ "geeksforgeeks" , "unsorted" , "sunday" , "just" , "sss" ]
printList( list , string, 5 )
|
C#
using System;
class GFG{
static int NO_OF_CHARS = 256;
static void print( string [] list, string word,
int list_size)
{
int [] map = new int [NO_OF_CHARS];
int i, j, count, word_size;
for (i = 0; i < word.Length; i++)
map[word[i]] = 1;
word_size = word.Length;
for (i = 0; i < list_size; i++)
{
for (j = 0, count = 0; j < list[i].Length; j++)
{
if (map[list[i][j]] > 0)
{
count++;
map[list[i][j]] = 0;
}
}
if (count == word_size)
Console.WriteLine(list[i]);
for (j = 0; j < word.Length; j++)
map[word[j]] = 1;
}
}
public static void Main( string [] args)
{
string str = "sun" ;
string [] list = { "geeksforgeeks" , "unsorted" ,
"sunday" , "just" , "sss" };
print(list, str, 5);
}
}
|
Javascript
const NO_OF_CHARS = 256;
function printList(list, word, list_size) {
const map = new Array(NO_OF_CHARS).fill(0);
for (let i = 0; i < word.length; i++) {
map[word.charCodeAt(i)] = 1;
}
const word_size = word.length;
for (let i = 0; i < list.length; i++) {
let count = 0;
for (let j = 0; j < list[i].length; j++) {
if (map[list[i].charCodeAt(j)]) {
count++;
map[list[i].charCodeAt(j)] = 0;
}
}
if (count == word_size) {
console.log(list[i]);
}
for (let j = 0; j < word.length; j++) {
map[word.charCodeAt(j)] = 1;
}
}
}
const string = "sun" ;
const list = [ "geeksforgeeks" , "unsorted" , "sunday" , "just" , "sss" ];
printList(list, string, 5);
|
Output:
unsorted
sunday
Time Complexity: O(n + m) where n is total number of characters in the list of items. And m = (number of items in list) * (number of characters in the given word)
Space Complexity: O(n)
Please write comments if you find any bug in above code/algorithm, or find other ways to solve the same problem