如何使用单个字母组成单词
How to use single letters to form words
嘿,我目前有这段代码。它让用户将字符串输入到数组中,限制为 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>
标头才能使此函数正常工作。
- 使用std::mt19937从字符串中返回一个随机单词
- 使用if-else将数字转换为单词
- 使用单词"not"作为C ++类的名称会导致VS2019错误
- 使用 BFS 的单词梯 2
- 视觉C++使用 map 来比较字符串中的每个单词
- 如何使用Qt删除单词中的表行
- 如何使用运算符>>在自定义字符串中输入多个单词?
- 计算一个单词在映射中出现的次数 - 使用 transform() - 调用不匹配
- C++ - 使用结构数据类型将单词中的单个小写字符更改为大写,反之亦然
- 如何制作一个程序,它使用特定单词加密和解密消息?
- 使用正则表达式c++从单词和分隔符之间的字符串中提取所有子字符串
- 在C++中使用哪个函数来输入多个单词,比如C中的fgets
- 使用结构数组计算文本文件中单词的出现次数C++
- 如何使用训练的跳跃模型预测单词?
- 如何使用向量 c++ 迭代文件中单词的位置
- 使用 c++ MuPDF 突出显示 PDF 中的一些单词
- 它如何排列单词以使用 qsort 和字符串
- 可视化如何插入单词并使用它在C 中进行IF进行比较
- 在搜索单词时使用问号来代表任何字符
- 移动字符串中的单词,单词之间使用空格作为分隔符