2017-02-21 50 views
2

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

鉴于串ABC * 2,该方案将打印出:

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

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

谢谢。

* 1只要与以前的所有条目不同,就会以任意顺序打印出字母a,b和c的所有三个字母组合。

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

+0

你应该澄清 '等' 的一部分。没有最大尺寸,就有无数的组合。 –

+0

@huck_cussler,我想现在我想要得到程序的主要逻辑,所以它受到ABC长度的限制,但是在将来我想添加一个实现来打印所有长度限制的组合。 – user264307

+0

如果输入是'AAB',你会怎么做? – stark

回答

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"))); 

然后结合不同size S的排列在C#中implmentation它可以很容易地的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 
相关问题