道歉,如果之前已经回答过,但我找不到一个好名字来搜索我正在寻找的东西。我有可能在1-5个字符串变量之间(我们称之为A,B,C,D,E),它们可以具有由' P'和' S'这些是用于复数和单数的单词形式
数据将始终采用相同的顺序ABCDE,因此这不是一个问题,但它可能不包含全部五个(可能只有A,AB,ABC或ABCD)。我正在寻找能够处理这种可能性的算法,同时生成所有潜在的复数/奇异组合。所以在5变量字符串的情况下,结果将是: SSSSS, SPSSS, SPPSS, SPSPS, ... PPPPP
我有逻辑来复数和存储数据它只是一个问题,即生成所有这些组合的逻辑是什么。如果重要,我在C#工作。任何帮助将不胜感激!
答案 0 :(得分:2)
所以只有两个可能的值,0和1.等一下......零和一个......为什么听起来很熟悉......?啊,二元救援!
让我们以二进制计算一点,从0开始。
如果查看前两行的最右边的位,我们可以得到1位,0和1的所有可能组合。
如果然后查看前四行中最右边的两位,则会获得所有2位组合:00,01,10和11.
前八行包含所有三位组合等。
如果您想要x
位的所有可能组合,请计算从0
到(2^x)-1
的所有数字,并查看以二进制写入的数字的最后{{1}}位。
(同样,如果您有三个可能的值(0,1和2),则可以在x
和0
之间进行计数,并在写入时查看最后(3^x)-1
个数字所有可能的数值都是三元的,等等。)
答案 1 :(得分:0)
我建议使用递归算法。例如,这样的算法可能是你问题的答案(我真的不知道你究竟想要什么样的回报值)
public void getAllWords(ref List<string> result, string Prefix, int wordLength)
{
if(wordLength == 0)
result.add(prefix);
else
{
getAllWords(result, prefix+"0", wordLength-1);
getAllWords(result, prefix+"1", wordLength-1);
}
}
用
调用List<string> result = new List<string>();
getAllWords(result, "", 5);
我希望这有效,我现在在移动设备上。
您可以根据需要更改它,因为您想要考虑不同的字母(例如值0,1,2 ..)。
答案 2 :(得分:0)
您可以枚举0到2 ^ 5-1(即从0到31)的所有整数,并将每个整数表示为bool[]
。可能会有所帮助:
static bool[][] GetCombinations(int wordCount) {
int length = (int) Math.Pow(2, wordCount);
bool[][] res = new bool[length][];
for (int i = 0; i < length; i++)
{
res [i] = new bool[wordCount];
for (int j = 0; j < wordCount; j++) {
res [i] [j] = ((i & (int)Math.Pow (2, j)) != 0);
}
}
return res;
}
答案 3 :(得分:0)
“递归排列C#”将成为谷歌搜索的诀窍。但我想我会尝试使用简单的计数和位屏蔽来为您解决问题。这里有一些代码可以进行“二进制”计数,并使用位移,确定单词中的位置是否应该是多元化的(你提到你已经有了这些细节):
string input = "red bag";
string[] tokens = input.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
string[] test = new string[tokens.Length];
int size = (int)Math.Pow(tokens.Length, 2);
for (int i = 0; i < size; i++)
{
for (int j = 0; j < tokens.Length; j++)
{
int mask = (1 << j);
if ((mask & i) != 0)
{
test[j] = Pluralize(tokens[j]);
}
else
{
test[j] = Singularize(tokens[j]);
}
}
Console.WriteLine(string.Join(" ", test));
}
输出:
red bag
reds bag
red bags
reds bags