给定一个小写单词列表。实现一个函数来查找所有具有相同唯一字符集的单词。
例子:
Input: words[] = { "may", "student", "students", "dog",
"studentssess", "god", "cat", "act",
"tab", "bat", "flow", "wolf", "lambs",
"amy", "yam", "balms", "looped",
"poodle"};
Output :
looped, poodle,
lambs, balms,
flow, wolf,
tab, bat,
may, amy, yam,
student, students, studentssess,
dog, god,
cat, act,
All words with same set of characters are printed
together in a line.
这个想法是使用散列。我们为所有单词生成一个键。键包含所有唯一字符(对于小写字母,键的大小最多为 26)。我们将单词的索引存储为键的值。一旦我们填充了哈希表中的所有键和值,我们就可以通过遍历表来打印结果。
下面是上述想法的实现。
C++
// C++ program to print all words that have
// the same unique character set
#include
using namespace std;
#define MAX_CHAR 26
// Generates a key from given string. The key
// contains all unique characters of given string in
// sorted order consisting of only distinct elements.
string getKey(string &str)
{
bool visited[MAX_CHAR] = { false };
// store all unique characters of current
// word in key
for (int j = 0; j < str.length(); j++)
visited[str[j] - 'a'] = true ;
string key = "";
for (int j=0; j < MAX_CHAR; j++)
if (visited[j])
key = key + (char)('a'+j);
return key;
}
// Print all words together with same character sets.
void wordsWithSameCharSet(string words[], int n)
{
// Stores indexes of all words that have same
// set of unique characters.
unordered_map > Hash;
// Traverse all words
for (int i=0; i
Java
// Java program to print all words that have
// the same unique character set
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map.Entry;
public class GFG {
static final int MAX_CHAR = 26;
// Generates a key from given string. The key
// contains all unique characters of given string
// in sorted order consisting of only distinct elements.
static String getKey(String str)
{
boolean[] visited = new boolean[MAX_CHAR];
Arrays.fill(visited, false);
// store all unique characters of current
// word in key
for (int j = 0; j < str.length(); j++)
visited[str.charAt(j) - 'a'] = true ;
String key = "";
for (int j=0; j < MAX_CHAR; j++)
if (visited[j])
key = key + (char)('a'+j);
return key;
}
// Print all words together with same character sets.
static void wordsWithSameCharSet(String words[], int n)
{
// Stores indexes of all words that have same
// set of unique characters.
//unordered_map > Hash;
HashMap> Hash = new HashMap<>();
// Traverse all words
for (int i=0; i get_al = Hash.get(key);
get_al.add(i);
Hash.put(key, get_al);
}
// if key is not present in the map
// then create a new list and add
// both key and the list
else
{
ArrayList new_al = new ArrayList<>();
new_al.add(i);
Hash.put(key, new_al);
}
}
// print all words that have the same unique character set
for (Entry> it : Hash.entrySet())
{
ArrayList get =it.getValue();
for (Integer v:get)
System.out.print( words[v] + ", ");
System.out.println();
}
}
// Driver program to test above function
public static void main(String args[])
{
String words[] = { "may", "student", "students", "dog",
"studentssess", "god", "cat", "act", "tab",
"bat", "flow", "wolf", "lambs", "amy", "yam",
"balms", "looped", "poodle"};
int n = words.length;
wordsWithSameCharSet(words, n);
}
}
// This code is contributed by Sumit Ghosh
Python
# Python program to print all words that
# have the same unique character set
# Function to group all strings with same characters
from collections import Counter
def groupStrings(input):
# traverse all strings one by one
# dict is an empty dictionary
dict={}
for word in input:
# sort the current string and take it's
# sorted value as key
# sorted return list of sorted characters
# we need to join them to get key as string
# Counter() method returns dictionary with frequency of
# each character as value
wordDict=Counter(word)
# now get list of keys
key = wordDict.keys()
# now sort these keys
key = sorted(key)
# join these characters to produce key string
key = ''.join(key)
# now check if this key already exist in
# dictionary or not
# if exist then simply append current word
# in mapped list on key
# otherwise first assign empty list to key and
# then append current word in it
if key in dict.keys():
dict[key].append(word)
else:
dict[key]=[]
dict[key].append(word)
# now traverse complete dictionary and print
# list of mapped strings in each key separated by ,
for (key,value) in dict.iteritems():
print ','.join(dict[key])
# Driver program
if __name__ == "__main__":
input=['may','student','students','dog','studentssess','god','cat','act','tab','bat','flow','wolf','lambs','amy','yam','balms','looped','poodle']
groupStrings(input)
C#
// C# program to print all words that
// have the same unique character set
using System;
using System.Collections.Generic;
class GFG{
static readonly int MAX_CHAR = 26;
// Generates a key from given string. The
// key contains all unique characters of
// given string in sorted order consisting
// of only distinct elements.
static String getKey(String str)
{
bool[] visited = new bool[MAX_CHAR];
// Store all unique characters of current
// word in key
for(int j = 0; j < str.Length; j++)
visited[str[j] - 'a'] = true;
String key = "";
for(int j = 0; j < MAX_CHAR; j++)
if (visited[j])
key = key + (char)('a' + j);
return key;
}
// Print all words together with same character sets.
static void wordsWithSameCharSet(String []words, int n)
{
// Stores indexes of all words that have same
// set of unique characters.
//unordered_map > Hash;
Dictionary> Hash = new Dictionary>();
// Traverse all words
for (int i = 0; i < n; i++)
{
String key = getKey(words[i]);
// If the key is already in the map
// then get its corresponding value
// and update the list and put it
// in the map
if (Hash.ContainsKey(key))
{
List get_al = Hash[key];
get_al.Add(i);
Hash[key]= get_al;
}
// If key is not present in the map
// then create a new list and add
// both key and the list
else
{
List new_al = new List();
new_al.Add(i);
Hash.Add(key, new_al);
}
}
// Print all words that have the
// same unique character set
foreach(KeyValuePair> it in Hash)
{
List get =it.Value;
foreach(int v in get)
Console.Write( words[v] + ", ");
Console.WriteLine();
}
}
// Driver code
public static void Main(String []args)
{
String []words = { "may", "student", "students",
"dog", "studentssess", "god",
"cat", "act", "tab",
"bat", "flow", "wolf",
"lambs", "amy", "yam",
"balms", "looped", "poodle"};
int n = words.Length;
wordsWithSameCharSet(words, n);
}
}
// This code is contributed by Princi Singh
输出:
looped, poodle,
lambs, balms,
flow, wolf,
tab, bat,
may, amy, yam,
student, students, studentssess,
dog, god,
cat, act,
时间复杂度: O(n*k) 其中 n 是字典中的单词数,k 是单词的最大长度。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。