重复使用单词的单词排列
本文关键字:单词 排列 | 更新日期: 2023-09-27 18:23:44
我正试图从单词数组中生成一个组合列表。
我一直在使用http://www.codeproject.com/Articles/26050/Permutations-Combinations-and-Variations-using-C-G生成组合
var words = File.ReadAllLines(@"C:'words.txt");
var allCombinations = new List<string>();
var combis = new Combinations<string>(words, 3, GenerateOption.WithRepetition);
allCombinations.AddRange(combis.Select(c => c.Aggregate((j, k) => j + "-" + k)));
给定3个单词"Word1"、"Word2"answers"Word3",我得到一个类似的组合列表
"Word1-Word1-Word1"
"Word1-Word1-Word2"
"Word1-Word1-Word3"
等等。
但我缺少一个单词多次使用的组合
"Word1-Word2-Word1"
"Word1-Word3-Word1"
"Word2-Word1-Word2"
如何获得多次使用单词的单词组合?
你的情况基本上就像在基数3:中计数一样
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
// and so on..
如果您使用的库没有实现所需的逻辑,您可以自己实现它。想法如下:
public static IEnumerable<string> Permutate(string[] words)
{
// 0 0 0
int[] indices = new int[words.Length];
// yield 0 0 0
yield return string.Join("-", indicies.Select(x => words[x]));
// moves to 0 0 1 and so on, returns false after 3 3 3
while (CountStep(indicies))
{
// yield next permutation
yield return string.Join("-", indicies.Select(x => words[x]));
}
}
实施CountStep也不难:
public static bool CountStep(int[] arr)
{
// assumes we count in base N for an N sized array
var maxDigit = arr.Length - 1;
for (var i = arr.Length - 1; i >= 0; i--)
{
if (arr[i] < maxDigit)
{
arr[i]++;
for (var j = i + 1; j < arr.Length; j++)
{
arr[j] = 0;
}
return true;
}
}
return false;
}