如何使用单个字母组成单词

时间:2013-10-24 15:30:10

标签: c++

嘿,我目前有这个代码。它让用户将字符串输入到数组中,限制为5.我计划使用数组然后从数组中形成单词。我怎样才能做到这一点?

    const int row = 5;
    char array[row];
    char count = 0;
    char letter;
    while (count < 5)
    {
        cout << "Enter a letter: ";
        cin >> letter;
        array[count] = letter;
        count++;
    }
    cout << "Letter inputed" << endl;
    for (count = 0; count < 5; count++)
    {
        cout << array[count] << " " <<  endl;
    }
    system("pause");

3 个答案:

答案 0 :(得分:3)

这是一个让你开始走上正确轨道的提示:甚至不考虑使用std::next_permutation,除非这是你曾经只使用过一次或两次的东西(可能不会即便如此,因为它实际上比做正确的工作更复杂。)

使用std::next_permutation,您的功能大约为N!时间慢于必要 1 - 在5个字母的情况下,这将慢120倍,如果你使用更长的单词,它会变得更糟非常快速(例如,10个字母,超过350万)。

相反,首先要预处理字典。而不是std::set<std::string>个单词,而是创建std::map<std::string, std::vector<string>>(或std::unordered_map,尽管英语中的单词很少,这可能不会产生很大的差异。当您从字典中读取单词时,请创建该字符串的排序版本。使用它作为键,并将该单词的原始版本推送到该键的向量上。

然后当你从用户那里得到一个单词时,对它进行排序,在地图中查找,相关的向量将包含可以从这些字母创建的每个单词(来自你的字典)。


<子> 1.如果您使用的是std::map而不是std::unordered_map,那应该类似于N!/(log N),但N!增长得如此之快,而log N增长得如此之快以至于差异可以忽略不计(如果你得到N足够大,那么log N = 3,N!就会大到N!/ log N计算步骤......好吧,你开始进入宇宙学的问题,比如宇宙是否会有在此之前死于热死(答案似乎是“是的,可能”)。

答案 1 :(得分:2)

这是一个让你入门的提示。标准库中有一个名为std::next_permutation的函数。假设您有一个要检查的单词词典,可能的解决方案可能如下所示:

std::sort(array, array + row);
do {
    // Check if array is a word.
} while (std::next_permutation(array, array + row));

这将循环遍历每个字母的排列。现在由您来验证它是否是一个有效的单词。

答案 2 :(得分:1)

此解决方案使用关联数组从单词的已排序字母映射到具有此类已排序字母的单词。因此,可以在地图中使用一个查找获得答案,该查询采用渐近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>标头才能正常工作。