字符串生成

时间:2010-05-23 14:58:11

标签: c++ permutation

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

给定字符:ab

我想生成以下字符串:

aa
ab
ba
bb

我所想到的是(只有2个输入)两个for循环,一个在另一个内,然后循环每个到输入的数量,在这种情况下是2,输出字符串将是2 * 2 = 4字符串和数字增加时,输出字符串的数量将通过乘以n * n(n次)

而增加

5 个答案:

答案 0 :(得分:1)

这是Kleene closure (Kleene star)的变体,如果这有助于您找到解决方案。

答案 1 :(得分:1)

你的方法(尽管我理解它)听起来不错,但是第一次尝试,虽然布丁的证据正在吃它,所以编写代码并测试它: - )

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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;
}

答案 4 :(得分:0)

您可以使用std :: next_permutation。即使你重复字母(即letters =“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()));
}