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

How to use single letters to form words

本文关键字:单词 何使用 单个字      更新时间:2023-10-16

嘿,我目前有这段代码。它让用户将字符串输入到数组中,限制为 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");
这里有

一个提示,让你开始走上正确的轨道:甚至不要考虑使用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的计算步骤...好吧,你开始陷入宇宙学的问题,比如宇宙是否会在那之前死于热寂(答案似乎是"是的,可能")。

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

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

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

此解决方案使用关联数组从单词的排序字母映射到具有此类排序字母的单词。因此,可以通过在地图上的一次查找来获得答案,这需要渐近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>标头才能使此函数正常工作。