【问题标题】:Strings Generation字符串生成
【发布时间】:2010-05-23 14:58:10
【问题描述】:

我想知道如何从某些给定字符创建各种字符串,例如:

给定字符:ab

我想生成以下字符串:

aa
ab
ba
bb

我想到的是(仅用于 2 个输入)两个 for 循环一个内一个,然后将每个循环循环到输入数,在这种情况下为 2,输出字符串将为 2*2 = 4字符串,随着数量的增加,输出字符串的数量将增加 n*n (n-times)

【问题讨论】:

  • 您希望程序在输入超过两个字符时表现如何?
  • 给定三个字符会发生什么?您是否仍然想要所有长度为 2 且仅使用这些字符的字符串,或者输出长度也会增加到 3? (另外,如果这是作业,请使用homework 标签)
  • BlueRaja,我忘了说字符串长度与输入字符的数量无关......所以我可能有 2 个输入,字符串长度可以是 3 个字符,所以输出将变为: aaa, aab, aba, abb, 咩, bab, bba, bbb

标签: c++ permutation


【解决方案1】:

这是Kleene closure (Kleene star) 的变体,如果它可以帮助您找到解决方案。

【讨论】:

    【解决方案2】:

    你的方法(据我所知)听起来不错,虽然布丁的证据是吃它,所以编写代码并测试它:-)

    请注意,它不会很好地扩展,所以问题是您希望生成多少个字符和多长的字符串。如果答案是“不多”,并且性能/内存消耗不是问题,那么坚持使用最简单的可行解决方案就可以了。否则,您需要更复杂的算法。

    前段时间我有一个类似的任务,其中可能的排列数量如此之多,以至于根本没有足够的内存来同时包含每个排列。所以我们尝试用数字对排列建模:注意,任何 m 个字符的 n 长排列都可以用 m 的基数 n 个数字。因此,通过遍历从 0 到 mn 的所有整数值,调用一个相当简单的转换方法可以一一获取每个可能的字符串。当然,对于索引值,您可能需要使用更大的整数类型,例如 long long,以获得更大的 mn 值。

    【讨论】:

    • 嗯,字符数可能从 40 到 60 不等,字符串长度最多为 16 个字符……我只能制作第一组字符串,我无法移动转到第二组字符串。
    • @sikas:从 60 个字母的字母表中生成每个 16 个字符的单词需要 25,657,845,139,503,479 TB 的内存。我想你可能想再看看你的要求(如果你希望暴力破解一个 16 个字符的密码,那你就很不走运了——即使使用地球上的每台计算机,也需要大约 100,000 年)
    • 因此不可能为大量输入字符和大长度字符串生成所有可能的组合...
    • @sikas,确实有可能,只是您不能同时将 所有 排列保存在内存中。
    • @Péter Török:好的,首先很抱歉迟到了,因为我正在处理我的研究生项目,除了这个......所以我可以将输出(每个排列)发送到一个文件在附加模式?我想这会节省内存。
    【解决方案3】:

    我认为这是一个排列问题..

    http://www.bearcave.com/random_hacks/permute.html

    【讨论】:

    • 这比排列更简单——排列不允许重复
    【解决方案4】:

    使用递归(只是一个想法演示):

    void generate(std::string& s, size_t beg) {
      for (char c = 'a'; c <= 'b'; ++c) {
        s[beg] = c;
        if (beg < s.length() - 1) {
          generate (s, beg + 1);
        }
        else {
          std::cout << s << std::endl;
        }
      }
    }
    
    int main() {
      std::string s = "####";
      generate(s, 0);
      return 0;
    }
    

    【讨论】:

      【解决方案5】:

      您可以使用 std::next_permutation。即使您重复字母(即字母=“ababcd”),这也将起作用。

      #include <algorithm>
      #include <iostream>
      #include <string> 
      
      
      int main(int argc, char** argv) {
          std::string letters = "abcd";
      
          std::sort(letters.begin(), letters.end());
          do {
              std::cout << letters << "\n";
          }
          while (std::next_permutation(letters.begin(), letters.end()));
      }
      

      【讨论】:

      • -1 给出不正确的结果 - 这为 OP 的示例输出两行,应该有四行。他不是要求排列...
      • 对不起,我不知道为什么我认为他在要求排列 ;-/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多