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

C++ 如何使用单个字母组成单词,c++,C++,嘿,我现在有这个代码。它让用户将字符串输入到数组中,限制为5。我计划使用数组,然后从数组中形成单词。我怎样才能做到这一点 const int row = 5; char array[row]; char count = 0; char letter; while (count < 5) { cout << "Enter a letter: "; cin >> letter;

嘿,我现在有这个代码。它让用户将字符串输入到数组中,限制为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");
const int row=5;
字符数组[行];
字符数=0;
字符字母;
同时(计数<5)
{
字母;
数组[计数]=字母;
计数++;
}

cout这里有一个提示让你开始。标准库中有一个函数名为
std::next\u permutation
。假设您有一个单词词典要检查,可能的解决方案如下:

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

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

此解决方案使用关联数组将单词的排序字母映射到具有此类排序字母的单词。因此,只需在地图中查找一次就可以得到答案,这需要渐进的
O(logn)
时间,其中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;
    }
}

你需要添加<代码> <代码>页眉,这个函数起作用。

< p>这里有一个提示让你开始正确的轨道:不要考虑使用<代码> STD::NExtx置换< /Cord>。除非这是你只使用过一次或两次(甚至可能不是这样,因为它实际上比做作业更复杂)。 使用
std::next_permutation
,您的函数大约为N!比必要的慢1倍——在5个字母的情况下,这将慢120倍,如果你使用更长的单词,情况会很快变得更糟(例如,10个字母超过350万)

相反,从预处理字典开始。创建一个
std::map
(或者
std::unordered_map
,而不是
std::set
的单词集,尽管英语单词太少,这可能不会产生太大的差异)。当您从字典中读入一个单词时,创建该字符串的排序版本。使用该键,并将单词的原始版本推送到该键的向量上

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


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

到目前为止,您尝试过什么?您是否有一本法律词汇词典可供核对?您指的是有意义的单词还是这些字母的排列方式?有意义的单词,但我想排列方式的示例将是一个很好的示例。那么程序如何知道字母序列是否为英语(或您使用的任何语言)word?但您输入的是字符,而不是字符串。此外,数组最初应按字母顺序排序,以获得所有应为
array+(第1行)的排列
,否则你也会移动
\0
。这不是一个字符串,而是一个字符数组。他从不在里面放
\0
。复杂性将是
O(row!*#dict)
5!==120
)。当然。但就像我说的,这是一个“提示”“让他开始。修正了我的答案来实现这项技术。不过,我不太确定topicstarter是否想深入研究复杂性理论。@Jarod42:我从来没有听说过一个专门为它命名的名字,尽管它可能应该有一个——它不是很明显,而且(在适当的情况下)它非常有用。@JerryCoffin一点也不知道我为什么用那种方式做。(还发现了一个打字错误。)谢谢。@user2881555正在等待您的输入。如果您需要像
字母这样的消息,请!
您可以自己添加,但这被认为不是一个好的编程实践。@polkovinkov.ph Hmm当我运行它时,我输入,比如说
a
它会关闭program@user2881555如果您使用的是Visual Studio 2008或更低版本,您可以使用Ctrl-F5键运行程序,以防止if在结束时立即退出。如果您在Windows上,并且希望程序在退出时始终等待用户输入,请将
system(“pause”)
添加为
int main()的最后一行
页眉到顶部。如果您使用*nix,这将帮不上什么忙。虽然它没有退出,但它正在输出
当我只输入1个字母时,按任意键继续…
string strtolowers(string const & word) {
    string ret = word;
    transform(ret.begin(), ret.end(), ret.begin(), tolower);
    return ret;
}