一尘不染

生成任意字母的所有组合,最大长度为任意

algorithm

假设我有一个任意大小的数组,其中包含单个字符。我想计算这些字符的所有可能组合,直到任意长度。

因此,可以说我的数组是[1、2、3]。用户指定的长度为2。然后可能的组合为[11、22、33、12、13、23、21、31、32]。

我在寻找合适的算法时遇到了麻烦,该算法允许任意长度,而不仅仅是排列数组。哦,虽然速度不是绝对关键,但也应该相当快。


阅读 238

收藏
2020-07-28

共1个答案

一尘不染

只需加进位即可。

假设您的数组包含4个符号,而您想要的长度为3。

以000开头(即,单词上的每个符号=字母[0])

然后加起来:

000 001 002 003 010 011 …

该算法(给定这些索引)只是为了增加最低数量。如果达到字母表中符号的数量,则增加前一个数字(遵循相同的规则)并将当前值设置为0。

C ++代码:

int N_LETTERS = 4;
char alphabet[] = {'a', 'b', 'c', 'd'};

std::vector<std::string> get_all_words(int length)
{
  std::vector<int> index(length, 0);
  std::vector<std::string> words;

  while(true)
  {
    std::string word(length);
    for (int i = 0; i < length; ++i)
      word[i] = alphabet[index[i]];
    words.push_back(word);

    for (int i = length-1; ; --i)
    { 
      if (i < 0) return words;
      index[i]++;
      if (index[i] == N_LETTERS)
        index[i] = 0;
      else
        break;
    }
  }
}

代码未经测试,但是应该可以解决。

2020-07-28