Программа на C # не находит слов, которые можно сгенерировать из слова, добавив '.между персонажами? - PullRequest
2 голосов
/ 03 ноября 2010

Я задал этот вопрос в чате. но ответа нет, поэтому я задаю вопрос здесь.

Вопрос, например, взять слово abcd

имеет 4 символа. добавив '. 'между символами вы можете написать это как a.b.c.d

Правила
можно использовать только 1 точку между символами
можно использовать несколько точек в слове
Редактировать: могут быть символы без '. между ними. например (ab или abcd)
не может использовать точку в начале или конце слова, например .abcd или abcd. ложны

некоторые ответы
a.b.c.d
a.bcd
ab.cd
abc.d
a.b.cd
a.bc.d
ab.c.d
abc.d

сколько слов можно сделать. Как написать программу, чтобы найти его в C #?

Редактировать как отобразить каждое возможное слово?

Ответы [ 4 ]

8 голосов
/ 03 ноября 2010

Вам не нужно писать программу для этого.

Для слова из n символов существует n-1 позиций, в которых может быть точка (т.е. между каждой парой символов). Каждая позиция либо имеет точку, либо ее нет.

Следовательно, есть 2 n-1 возможных слов.

Если вы действительно хотите написать программу на C #, чтобы отобразить это:

using System;

class Test
{
    static void Main(string[] args)
    {
        // Argument validation left as an exercise for the reader
        string word = args[0];
        Console.WriteLine("Word {0} has {1} possibilities",
                          word, Math.Pow(2, word.Length - 1));
    }
}

РЕДАКТИРОВАТЬ: Обратите внимание, что это предполагает, что оригинальное слово (без точек) по-прежнему считается. Если вы не хотите, чтобы это считалось, вычтите одно из результата.

РЕДАКТИРОВАТЬ: я изменил вычисления, чтобы использовать Math.Pow так, чтобы:

  • Он справляется со словами, состоящими более чем из 33 букв (конечно, до другого предела)
  • Это понятнее
3 голосов
/ 03 ноября 2010

Вы можете сделать это рекурсивно.

Все возможные комбинации (abcd):

a + . + all combinations of (bcd)
ab + . + all combinations of (cd)
abc + . + all combinations of (d)
abcd

Код:

public static IEnumerable<string> GetCombinations(string str) {
  for (int i = 1; i < str.Length; i++) {
    foreach (string s in GetCombinations(str.Substring(i))) {
      yield return str.Substring(0, i) + "." + s;
    }
  }
  yield return str;
}

Использование:

foreach (string s in GetCombinations("abcd")) Console.WriteLine(s);
2 голосов
/ 03 ноября 2010

Количество комбинаций:

string s = "abcd";
int len = s.Length;
int combinations = 1 << (len - 1);

РЕДАКТИРОВАТЬ : как отмечает Павел в комментариях,

int combinations = 1 << (len - 1) - 1;

, чтобы удалить слово, которое не содержит точек, если этонедопустимая комбинация.

0 голосов
/ 03 ноября 2010

Зачем вам нужна программа?

, если строка имеет длину n, то есть n-1 мест, которые можно поставить.

В любом месте может быть,или нет, то есть два варианта.

ТАК ответ 2 ** (n-1) - 1 (-1 для ответа, который не имеет точек, то есть исходного слова)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...