打印包含给定单词的所有字符的列表项
有一个项目列表。给定一个特定的单词,例如“sun”,打印出列表中包含“sun”所有字符的所有项目。
例如,如果给定的单词是“sun”并且项目是“sunday”、“geeksforgeeks”、“utensils”、“”just”和“sss”,那么程序应该打印“sunday”和“utensils”。
算法:感谢 geek4u 提出这个算法。
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++
// C++ program to print all strings that contain all
// characters of a word
#include
#include
#include
using namespace std;
# define NO_OF_CHARS 256
/* prints list items having all characters of word */
void print(char list[][50], char *word, int list_size)
{
/*Since calloc is used, map[] is initialized as 0 */
int *map = new int[(sizeof(int)*NO_OF_CHARS)];
int i, j, count, word_size;
/*Set the values in map */
for (i = 0; *(word+i); i++)
map[*(word + i)] = 1;
/* Get the length of given word */
word_size = strlen(word);
/* Check each item of list if has all characters
of word*/
for (i = 0; i < list_size; i++)
{
for (j = 0, count = 0; *(list[i] + j); j++)
{
if (map[*(list[i] + j)])
{
count++;
/* unset the bit so that strings like
sss not printed*/
map[*(list[i] + j)] = 0;
}
}
if (count == word_size)
cout << list[i] << endl;
/*Set the values in map for next item*/
for (j = 0; *(word + j); j++)
map[*(word + j)] = 1;
}
}
/* Driver code*/
int main()
{
char str[] = "sun";
char list[][50] = {"geeksforgeeks", "unsorted", "sunday",
"just", "sss" };
print(list, str, 5);
return 0;
}
// This is code is contributed by rathbhupendra
C
// C program to print all strings that contain all
// characters of a word
# include
# include
# include
# define NO_OF_CHARS 256
/* prints list items having all characters of word */
void print(char *list[], char *word, int list_size)
{
/*Since calloc is used, map[] is initialized as 0 */
int *map = (int *)calloc(sizeof(int), NO_OF_CHARS);
int i, j, count, word_size;
/*Set the values in map */
for (i = 0; *(word+i); i++)
map[*(word + i)] = 1;
/* Get the length of given word */
word_size = strlen(word);
/* Check each item of list if has all characters
of word*/
for (i = 0; i < list_size; i++)
{
for (j = 0, count = 0; *(list[i] + j); j++)
{
if (map[*(list[i] + j)])
{
count++;
/* unset the bit so that strings like
sss not printed*/
map[*(list[i] + j)] = 0;
}
}
if (count == word_size)
printf("\n %s", list[i]);
/*Set the values in map for next item*/
for (j = 0; *(word+j); j++)
map[*(word + j)] = 1;
}
}
/* Driver program to test to print printDups*/
int main()
{
char str[] = "sun";
char *list[] = {"geeksforgeeks", "unsorted", "sunday",
"just", "sss" };
print(list, str, 5);
getchar();
return 0;
}
Java
// Java program to print all strings that contain all
// characters of a word
class GFG
{
static final int NO_OF_CHARS = 256;
/* prints list items having all characters of word */
static void print(String[] list, String word, int list_size)
{
/*
* Since calloc is used, map[] is initialized as 0
*/
int[] map = new int[NO_OF_CHARS];
int i, j, count, word_size;
/* Set the values in map */
for (i = 0; i < word.length(); i++)
map[word.charAt(i)] = 1;
/* Get the length() of given word */
word_size = word.length();
/*
* Check each item of list if has all characters of word
*/
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++;
/*
* unset the bit so that strings like sss not printed
*/
map[list[i].charAt(j)] = 0;
}
}
if (count == word_size)
System.out.println(list[i]);
/* Set the values in map for next item */
for (j = 0; j < word.length(); j++)
map[word.charAt(j)] = 1;
}
}
/* Driver code */
public static void main(String[] args)
{
String str = "sun";
String[] list = { "geeksforgeeks", "unsorted",
"sunday", "just", "sss" };
print(list, str, 5);
}
}
// This code is contributed by sanjeev2552
Python
# Python program to print the list items containing all
# characters of a given word
NO_OF_CHARS = 256
# Prints list items having all characters of word
def printList(list, word, list_size):
map = [0] * NO_OF_CHARS
# Set the values in map
for i in word:
map[ord(i)] = 1
# Get the length of given word
word_size = len(word)
# Check each item of list if has all characters
# of words
for i in list:
count = 0
for j in i:
if map[ord(j)]:
count+=1
# unset the bit so that strings like sss
# not printed
map[ord(j)] = 0
if count==word_size:
print i
# Set the values in map for next item
for j in xrange(len(word)):
map[ord(word[j])] = 1
# Driver program to test the above function
string = "sun"
list = ["geeksforgeeks", "unsorted", "sunday", "just", "sss"]
printList(list, string, 5)
# This code is contributed by Bhavya Jain
C#
// C# program to print all strings that contain
// all characters of a word
using System;
class GFG{
static int NO_OF_CHARS = 256;
// Prints list items having all characters of word
static void print(string[] list, string word,
int list_size)
{
// Since calloc is used, map[] is
// initialized as 0
int[] map = new int[NO_OF_CHARS];
int i, j, count, word_size;
// Set the values in map
for (i = 0; i < word.Length; i++)
map[word[i]] = 1;
// Get the length() of given word
word_size = word.Length;
// Check each item of list if has all
// characters of word
for(i = 0; i < list_size; i++)
{
for(j = 0, count = 0; j < list[i].Length; j++)
{
if (map[list[i][j]] > 0)
{
count++;
// unset the bit so that strings like
// sss not printed
map[list[i][j]] = 0;
}
}
if (count == word_size)
Console.WriteLine(list[i]);
// Set the values in map for next item
for(j = 0; j < word.Length; j++)
map[word[j]] = 1;
}
}
// Driver code
public static void Main(string[] args)
{
string str = "sun";
string[] list = { "geeksforgeeks", "unsorted",
"sunday", "just", "sss" };
print(list, str, 5);
}
}
// This code is contributed by ukasp
输出:
unsorted
sunday
时间复杂度: O(n + m),其中 n 是项目列表中的字符总数。并且 m =(列表中的项目数)*(给定单词中的字符数)