Я пытаюсь работать по сценарию, который я раньше не видел, и изо всех сил пытаюсь разработать алгоритм для его правильной реализации. Часть моей проблемы - это туманное воспоминание о правильной терминологии. Я считаю, что мне нужна вариация стандартной «комбинированной» проблемы, но я вполне мог бы быть там.Сочетания строк с заменой символов
Сценарий приведен пример строка "100"
(назовем его x
), производят все комбинации x
, меняющие местами одну из этих 0
(ноль) символов для o
(строчного O). Таким образом, для простого примера "100"
, я бы ожидать, этот вывод:
"100"
"10o"
"1o0"
"1oo"
Это нужно будет поддерживать изменения строк длины с различной номера 0
символов, но предположим, что никогда не будет более 5 экземпляров 0
.
У меня есть этот очень простой алгоритм, который работает на моем образце "100"
но разваливается за что больше/сложнее:
public IEnumerable<string> Combinations(string input)
{
char[] buffer = new char[input.Length];
for(int i = 0; i != buffer.Length; ++i)
{
buffer[i] = input[i];
}
//return the original input
yield return new string(buffer);
//look for 0's and replace them
for(int i = 0; i != buffer.Length; ++i)
{
if (input[i] == '0')
{
buffer[i] = 'o';
yield return new string(buffer);
buffer[i] = '0';
}
}
//handle the replace-all scenario
yield return input.Replace("0", "o");
}
У меня есть мучительное чувство, что рекурсия может быть мой друг, но я пытаясь понять, как включить в меня условную логику.
Разве вы не можете просто иметь локальный массив позиций нулей, а затем перечислить замены в виде двоичных чисел с нулем и малых о качестве двоичных цифр? –
@MOehm не уверен, что я следую тому, что вы имеете в виду, могли бы вы предоставить реализацию и/или дополнительную деталь? –