很抱歉,我没有回答您关于地图方法的问题。
但因为我认为其他方法可能更好,所以我将向您展示不同的解决方案。
我将使用标准方法来找出一个词是否是另一个词的字谜。标准程序是: 对单词中的字母进行排序。如果两个单词的字母排序相同,那么我们就有了一个字谜。
非常简单的例子:
gartner --> aegnrrt
授予者 --> aegnrrt
那么,该怎么做:我们将制作原始数据的副本。此外,我们将索引存储到原始数据。然后,我们对复制列表中所有单词的字母进行排序。然后,对单词列表进行排序(使用排序后的字母)。结果,字谜将彼此相邻。
在一个额外的循环中,我们将检查相邻的值并设置一个标志,如果我们发现了一个字谜。
然后我们将结果展示给用户。
请查看附件代码。请注意:这是众多可能性之一。 . .
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iomanip>
#include <iterator>
#include <iomanip>
// Random Word list
std::vector<std::string> words{"Lorem", "ipsum", "dolor", "sit", "amet", "consetetur", "sadipscing", "elitr", "sed", "diam", "nonumy", "eirmod", "tempor", "invidunt", "ut", "labore", "et", "dolore", "magna", "aliquyam", "erat", "sed", "diam", "voluptua", "At", "vero", "eos", "et", "accusam", "et", "justo", "duo", "dolores", "et", "ea", "rebum", "Stet", "clita", "kasd", "gubergren", "no", "sea", "takimata", "sanctus", "est", "Lorem", "ipsum", "dolor", "sit", "amet", "Lorem", "ipsum", "dolor", "sit", "amet", "consetetur", "sadipscing", "elitr", "sed", "diam", "nonumy", "eirmod", "tempor", "invidunt", "ut", "labore", "et", "dolore", "magna", "aliquyam", "erat", "sed", "diam", "voluptua", "At", "vero", "eos", "et", "accusam", "et", "justo", "duo", "dolores", "et", "ea", "rebum", "Stet", "clita", "kasd", "gubergren", "no", "sea", "takimata", "sanctus", "est", "Lorem", "ipsum", "dolor", "sit", "amet", "Lorem", "ipsum", "dolor", "sit", "amet", "consetetur", "sadipscing", "elitr", "sed", "diam", "nonumy", "eirmod", "tempor", "invidunt", "ut", "labore", "et", "dolore", "magna", "aliquyam", "erat", "sed", "diam", "voluptua", "At", "vero", "eos", "et", "accusam", "et", "justo", "duo", "dolores", "et", "ea", "rebum", "Stet", "clita", "kasd", "gubergren", "no", "sea", "takimata", "sanctus", "est", "Lorem", "ipsum", "dolor", "sit", "amet", "Duis", "autem", "vel", "eum", "iriure", "dolor", "in", "hendrerit", "in", "vulputate", "velit", "esse", "molestie", "consequat", "vel", "illum", "dolore", "eu", "feugiat", "nulla", "facilisis", "at", "vero", "eros", "et", "accumsan", "et", "iusto", "odio", "dignissim", "qui", "blandit", "praesent", "luptatum", "zzril", "delenit", "augue", "duis", "dolore", "te", "feugait", "nulla", "facilisi"};
// We want to copy the words into a list along with its index for sorting
struct WordWithIndex {
WordWithIndex() {};
WordWithIndex(const std::string&s, size_t i) : word(s), index(i) {};
std::string word{};
size_t index{};
bool isAnagram{false};
};
int main()
{
// Create a new vector and initialize the size
std::vector<WordWithIndex> wordWithIndex(words.size());
// COpy the word list into new vector
std::transform(
words.begin(), words.end(), wordWithIndex.begin(),
[i=0U](const std::string& s) mutable { return WordWithIndex(s,i++);}
);
// Sort the letters in each word. Words with sorted letters, that are equal are an anagram
std::for_each(wordWithIndex.begin(),wordWithIndex.end(),
[](WordWithIndex& wwi) {std::sort(wwi.word.begin(),wwi.word.end());});
// Now sort the word list with sort criteria : Words with sorted letters
std::sort( wordWithIndex.begin(), wordWithIndex.end(),
[](WordWithIndex& wwi1, WordWithIndex& wwi2) {return wwi1.word < wwi2.word;}
);
// Find anagrams
std::vector<WordWithIndex>::iterator wIter = wordWithIndex.begin();
while (wIter != wordWithIndex.end()) {
std::vector<WordWithIndex>::iterator adjacentFound = std::adjacent_find(
wIter, wordWithIndex.end(),[](const WordWithIndex &a, const WordWithIndex &b){ return a.word == b.word;});
if (adjacentFound != wordWithIndex.end()) {
adjacentFound->isAnagram = true;
++adjacentFound;
adjacentFound->isAnagram = true;
}
wIter = adjacentFound;
}
// Show result
for (size_t i=0U; i < words.size(); ++i)
std::cout << std::left << std::setw(4) << i << "\t" << std::setw(25) << words[wordWithIndex[i].index] << "\t\tIs Anagram: " << std::boolalpha << wordWithIndex[i].isAnagram << "\n";
return 0;
}