C – 生成X字符单词的所有可能性

编辑:我的意思是排列,而不是组合。 谢谢。

我意识到这是一个相当开放的问题,我不是每个人都在寻找代码,但实际上有些提示从哪里开始。 我想要的是一个程序,它可以生成给定长度的每个字符组合,即用户输入4,程序将生成长度为4的ASCII字符的每种可能组合。

不确定我会从哪里开始,也许是使用哈希表? 当然会需要循环,但我不确定如何设计它们来生成组合。 到目前为止,它始终是一个案例,例如,循环直到1000件事情发生。

任何建议都非常感谢!

干杯,

T.

对于排列,您可以使用这样的递归解决方案(可以对其进行优化和改进):

 unordered_set permute_string(int n) { static const char chars[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; unordered_set s; if (n == 0) { s.insert(""); return s; } unordered_set perms = permute_string(n - 1); for (auto c = std::begin(chars); c < std::end(chars); ++c) for (auto i = perms.begin(); i != perms.end(); ++i) for (int pos = 0; pos < n; ++pos) s.insert(string(*i).insert(pos, 1, *c)); return s; } 

请注意,此函数的输出(无论如何实现)为26 n ,当n (此函数的输入)为4时为456,976。

你的问题太笼统了。 如何,你可以使用trie数据结构来获得你想要的东西。 但如果你打算用c做它仍然需要很多工作。 我建议使用一种语言,你不必重新创建轮子。

是的,这几乎需要一个递归的解决方案。 要生成所有N长度的单词,基本算法是

 pick the next letter from the alphabet generate all Nl-length words starting with that letter 

如果您需要做的就是在生成文件时将这些字符串打印到文件或其他内容,那么您不需要任何复杂的数据结构。 您只需要一个缓冲区来保存生成的单词。

重要提问:您确定要所有 ASCII字符的所有可能组合(包括标点符号,控制字符等)吗? 或所有可能的字母数字字符串组合? 或严格的字母字符串?

您可能希望在代码中指定字母表,例如

 char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

并只是索引到而不是假设一个特定的字符表示:

 char *p; for (p = alphabet; *p != 0; p++) // generate all words starting with *p 

这是一个完整且有效的解决方案,我刚刚从python方法itertools.permutations的文档转换为C ++。 http://docs.python.org/library/itertools.html#itertools.permutations 。 在原始的pythonforms中它是一个生成器(只是想迭代器),但我现在没有打扰它,虽然它会有很多意义。

permutations方法是一个模板,因此这适用于您可以存储在向量中的任何对象,而不仅仅是char。 使用此代码:

 vector alphab={'a','b','c','d'}; auto perms=permutations(alphab,3);' 

结果是’vector’向量表示abcd的所有非重复3组合:

 abc abd acb acd adb adc bac bad bca bcd bda bdc cab cad cba cbd cda cdb dab dac dba dbc dca dcb 

这是代码(C ++ 11):

 #include  #include  #include  using namespace std; size_t nperms(size_t n,size_t k){ if(k<=0) return 1; // one empty set if(k>n) return 0; // no possible ways size_t out=1; for (size_t i=n-k+1;i<=n;i++) out*=i; return out; } template vector permutations(T & iterable, size_t r=-1){ vector out; T & pool = iterable; size_t n = pool.size(); r = r>=0 ? r : n; if (r > n) return out; vector indices; for (size_t i=0;i cycles; for (size_t i=n;i>(nr);--i) cycles.push_back(i); vector line; //eg vector of char line.reserve(r); for (size_t i=0;i alphab={'a','b','c','d'}; auto perms=permutations(alphab,3); // print: cout <<"perms of size " < 

作为说明:

不检查字母是唯一的,而是通过索引完成排列和选择,因此如果您想要允许多个对象,只需将其添加到字母表中。 内容也无法比较。