我很难理解我发现的关于我的问题的所有不完整信息,所以我希望你能帮助我。我想编写一个程序来打印字符串的所有可能组合。例如:
如果字符串 ABC * 2,程序将打印出来:
我应该使用哪些算法?我真的是编程的初学者,我真的很难理解排列算法的逻辑,但我真的很想做这个程序。
感谢。
* 1这将以任何顺序打印字母a,b和c的所有三个字母组合,只要它与所有先前的条目不同即可。
* 2如果字符串是AAB,则输出将是A和B的所有组合,但限制为三个字符。
答案 0 :(得分:0)
将问题分成两部分:首先尝试在给定size
和alphabet
时使用不同的字符获取所有排列,例如: 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