该解决方案使用关联数组将单词的排序字母映射到具有此类排序字母的单词。因此,可以通过在地图中进行一次查找来获得答案,这需要渐近O(log N)
时间,其中 N 是您的字典的大小。
创建一个名为dic.txt
. 如果您正在使用Visual Studio
它,它应该与您的*.cpp
文件位于同一目录中。将几个单词以“一行中的单词”格式放入其中。试试下面的代码:
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;
int main() {
// Dictionary file is in a "word in a row" format
map< string, vector<string> > dictionary;
ifstream dictionary_file("dic.txt");
if (!dictionary_file.good()) {
cout << "File doesn't exist" << endl;
return 0;
}
string word;
while (dictionary_file >> word) {
string key = word;
sort(key.begin(), key.end());
dictionary[key].push_back(word);
}
// Read the letters
string letters;
cin >> letters;
if (letters.size() > 5) {
cout << "Too much letters" << endl;
return 0;
}
// Sort the letters
sort(letters.begin(), letters.end());
// Output the answers
vector<string> & ret = dictionary[letters];
for (size_t i = 0, ilen = ret.size(); i < ilen; ++i) {
cout << ret[i] << endl;
}
}
提到这样的解决方案关心您的字母所在的情况。如果您不需要它,您可以strtolower
在将单词添加到字典之前和对字母进行排序之前添加对函数的调用(从 PHP 获取该名称) .
string strtolowers(string const & word) {
string ret = word;
transform(ret.begin(), ret.end(), ret.begin(), tolower);
return ret;
}
您需要添加<cctype>
标题才能使此功能正常工作。