给定一个单词序列,打印所有字谜
字谜 − 字谜是指通过重新排列另一个单词或短语的字母形成的单词或短语,通常只进行一次。下面给出了一些字谜的示例:
Top - Pot
Silent - Listen
Post - Stop
Dog - God
问题陈述
给定一个单词数组 arr[]。对于给定的数组,打印所有字谜。
示例 1
输入
arr[] = {“star”, “god”, “vile”, “save”, “evil”, “care”, “arts”, “race”, “dog”, “vase”}
输出
arts star care race dog god evil vile save vase
解释
给定数组中的字谜是:
star - arts god - dog vile - evil save - vase care - race
示例 2
输入
arr[] = {“thing”, “top”, “inlets”, “pot”, “opt”, “listen”, “night”}
输出
inlets listen night thing opt pot top
解释
给定数组中的字谜是:
thing - night top - pot - opt inlets - listen
方法 1:单词排序
解决问题的一种方法是对 arr[] 中的单词进行排序,并创建一个映射,其中键是排序后的单词,值是具有相同排序后单词的单词的索引。根据存储在原始数组中的索引打印字谜。
伪代码
function anagrams(arr: vector of strings) -> set of sets of strings
initialize an empty set of sets called 'res'
create a copy of 'arr' called 'list'
for each word 's' in 'list'
sort the characters of 's' in ascending order
initialize an empty unordered map called 'map' (key: string, value: vector of integers)
for i = 0 to size of 'arr' - 1
add the index 'i' to the vector associated with the sorted word 'list[i]' in 'map'
for each entry in 'map'
initialize an empty set of strings called 'temp'
for each index 'i' in entry's value vector
add 'arr[i]' to 'temp'
if size of 'temp' > 1
add 'temp' to 'res'
return 'res'
示例:C++ 实现
以下程序将所有字谜一起打印出来。
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <set>
#include <algorithm>
using namespace std;
// Function to group anangrams together from the input array
set<set<string>> anagrams(vector<string> const &arr){
set<set<string>> res;
vector<string> list(arr);
// Sorting words
for (string &s : list){
sort(s.begin(), s.end());
}
// Pushing sorted words into map along with indices
unordered_map<string, vector<int>> map;
for (int i = 0; i < arr.size(); i++){
map[list[i]].push_back(i);
}
for (auto itr : map){
set<string> temp;
for (int i : itr.second){
temp.insert(arr[i]);
}
if (temp.size() > 1){
res.insert(temp);
}
}
return res;
}
int main(){
vector<string> arr = {"thing", "top", "inlets", "pot", "opt", "listen", "night"};
set<set<string>> res = anagrams(arr);
for (set<string> r : res){
for (string s : r){
cout << s << ' ';
}
cout << endl;
}
return 0;
}
输出
inlets listen night thing opt pot top
时间复杂度 − O(N*K logK),其中 N 是输入数组的大小,K 是字符串的平均长度。
空间复杂度 − O(N)
方法 2:使用 Multimap
为了在以上代码中实现高效的分组,我们将使用 multimap。Maultimap 提供高效的分组、恒定时间的插入、快速的查找、冲突处理和动态大小。
伪代码
function anagrams(arr: vector of strings) -> set of sets of strings
res = empty set of sets of strings
list = copy of arr
for each s in list
sort the characters of s in ascending order
map = empty unordered multimap of string to integer
for i = 0 to size of arr - 1
insert the pair (list[i], i) into map
itr = iterator pointing to the beginning of map
while itr is not at the end of map
temp = empty set of strings
curr = copy of itr
while itr is not at the end of map and itr's key is the same as curr's key
add arr[itr's value] to temp
move itr to the next element
if size of temp > 1
add temp to res
return res
示例:C++ 实现
以下程序将所有字谜一起打印出来。
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <set>
#include <algorithm>
using namespace std;
// Function to group anangrams together from the input array
set<set<string>> anagrams(vector<string> const &arr){
set<set<string>> res;
vector<string> list(arr);
// Sorting words
for (string &s : list){
sort(s.begin(), s.end());
}
unordered_multimap<string, int> map;
for (int i = 0; i < arr.size(); i++){
map.insert(make_pair(list[i], i));
}
auto itr = map.begin();
while (itr != map.end()){
set<string> temp;
for (auto curr = itr; itr != map.end() && itr->first == curr->first; itr++){
temp.insert(arr[itr->second]);
}
if (temp.size() > 1){
res.insert(temp);
}
}
return res;
}
int main(){
vector<string> arr = {"thing", "top", "inlets", "pot", "opt", "listen", "night"};
set<set<string>> res = anagrams(arr);
for (set<string> r : res){
for (string s : r){
cout << s << ' ';
}
cout << endl;
}
return 0;
}
输出
inlets listen night thing opt pot top
时间复杂度 − O(N*K logK + N + N*M),其中 N 是输入数组的大小,K 是字符串的平均长度。
空间复杂度 − O(N)
结论
总之,提供的 C++ 代码根据其排序后的表示形式有效地对给定单词列表中的字谜进行分组。提供的解决方案效率很高,并且可以根据特定的用例轻松地进行调整。
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP