我目前正在编写一个编码问题:
给定一个字符串数组,返回所有字符串组,即字谜。
例如,鉴于:
{asch, scah, bva, vba, soa}
返回
{ {asch, scah}, {bva, vba}, {soa}}
要解决这个问题少于O(n ^ 2)的时间,我们首先应该对每个单词进行排序,并将排序的单词分组在一个集合中,如果排序的单词是相同的。
我想使用二维hashmap。
map<string, map<int,string>> container;
使用这个二维hashmap,第一个键是排序单词,第二个键是原始序列中的索引,值是原始单词。
for(int i=0; i<sequence.size();i++)
{
string original_word = sequence[i];
string sorted_word = original_word;
sort(sorted_word.begin(),sorted_word.end());
container[sorted_word][i] = original_word;
}
在这个循环之后,我相信所有必须具有相同sorted_word的字谜将被分组到第一级hashmap中。
我的问题是,如何编写代码以获取具有相同sorted_word的集合?
我可以吗
for( iterator itr = container.begin(); itr != container.end(); itr++)
{
auto grouped_words = itr.second(); // what is the data type of grouped_word here?
}
如果有任何错误,请纠正我。感谢。
答案 0 :(得分:1)
我觉得这里有一个错误:
vector<string, vector<int,string>> container; // ???
在你的问题中,你谈到哈希映射,我想你的意思是:
unordered_map<string, unordered_map<int,string>> container;
在这种情况下,您可以按如下方式使用结果:
for( auto itr = container.begin(); itr != container.end(); itr++)
{
auto &grouped_words = itr->second; // prefer a reference
cout << itr->first<<": ";
for (auto &x : grouped_words) {
cout << "\t" << x.first << ":"<< x.second<<endl;
}
}
这是live demo。
修改:grouped_words
是(此处)对unordered_map<int, string>
的引用