如何打印多个字符的所有可能组合?

时间:2017-02-21 21:12:33

标签: algorithm combinations permutation

我很难理解我发现的关于我的问题的所有不完整信息,所以我希望你能帮助我。我想编写一个程序来打印字符串的所有可能组合。例如:

如果字符串 ABC * 2,程序将打印出来:

  • A; B; ç
  • AA; BB; CC; AB; AC;公元前; BA; CA; CB
  • AAA; BBB; CCC; AAB; AAC; ABB; ABC ... 等等。 * 1

我应该使用哪些算法?我真的是编程的初学者,我真的很难理解排列算法的逻辑,但我真的很想做这个程序。

感谢。

* 1这将以任何顺序打印字母a,b和c的所有三个字母组合,只要它与所有先前的条目不同即可。

* 2如果字符串是AAB,则输出将是A和B的所有组合,但限制为三个字符。

1 个答案:

答案 0 :(得分:0)

将问题分成两部分:首先尝试在给定sizealphabet时使用不同的字符获取所有排列,例如: C#代码可以是:

private static IEnumerable<string> Permutations(int size, string alphabet) {
  StringBuilder word = new StringBuilder(new string(alphabet[0], size));

  while (true) {
    string result = word.ToString();

    yield return result;

    if (result.All(c => c == alphabet[alphabet.Length - 1]))
      break;

    for (int i = word.Length - 1; i >= 0; --i)
      if (result[i] == alphabet[alphabet.Length - 1])
        word[i] = alphabet[0];
      else {
        word[i] = alphabet[alphabet.IndexOf(word[i]) + 1];

        break;
      }
  }
}

测试:

// AA, AB, AC, BA, BB, BC, CA, CB, CC
Console.Write(string.Join(", ", Permutations(2, "ABC")));

然后结合在C#implmentation的情况下不同size s的排列,可以在 Linq 的帮助下轻松完成:

string alphabet = "ABA";
int limit = alphabet.Length; //TODO: it's unclear what limit is, put the right one
string distinctAlphabet = string.Concat(alphabet.OrderBy(c => c).Distinct());

var result = Enumerable.Range(1, limit)
  .Select(length => string.Join("; ", Permutations(length, distinctAlphabet)));

Console.Write(string.Join(Environment.NewLine, result));

输出(source = "ABC";):

A; B; C
AA; AB; AC; BA; BB; BC; CA; CB; CC
AAA; AAB; AAC; ABA; ABB; ABC; ... ; CBB; CBC; CCA; CCB; CCC

输出(source = "ABA";):

A; B
AA; AB; BA; BB
AAA; AAB; ABA; ABB; BAA; BAB; BBA; BBB