разобрать все комбинации слов - PullRequest
0 голосов
/ 01 февраля 2011

Мне нужно взять строку слов, может быть любое количество слов и создать массив всех возможных комбинаций от первого слова до последнего слова.

пример ввода: (ввод может быть любым количеством слов, разделитель - пробел

"слово1 слово2 слово3"

Выход:

1: word1
2: word1 word2
3: word1 word2 word3
4: word2
5: word2 word3
6: word3

любой язык в порядке, но предпочитаю c #

Ответы [ 4 ]

1 голос
/ 01 февраля 2011

Haskell, просто потому, что он красив (по крайней мере, по сравнению с семейством C), и вы сказали любой язык:

combinations []     = [[]]
combinations (x:xs) = (combinations xs) ++ map (x:) (combinations xs)

Может быть вызвано так:

combinations ["word1", "word2", "word3"]

или как, если вам действительно нужно передать строку через пробел:

combinations (words "word1 word2 word3")
0 голосов
/ 01 февраля 2011

Решение haskell переведено на C #:

public static IEnumerable<IEnumerable<string>> Combinations(IEnumerable<string> words) {
  if (words.Count() == 0) {
    return new string[][] { new string[0] };
  } else {
    var x = words.First();
    var xs = words.Skip(1);
    var combinations = Combinations(xs);
    return combinations.Concat(combinations.Select(s => new string[] { x }.Concat(s)));
  }
}

И анализ строки:

public static IEnumerable<IEnumerable<string>> Combinations(string str) {
   return Combinations(str.Split(" "));
}
0 голосов
/ 01 февраля 2011

Простой способ:

  1. Считать от 1 до (1<<w)-1 включительно, где w - количество слов.Рассмотрим отдельные биты значения, если установлен n-й бит, то рассмотрим n-е слово, в противном случае пропустите его.
0 голосов
/ 01 февраля 2011

Звучит как домашнее задание.

Используйте string.split, а затем два для циклов.

var wordlist = "word1 word2 word3";
var words = wordlist.Split(' ');
var wordList = new List<string>();
for( var i=0; i<words.Length; i++ )
{
  var currentWord = words[i];
  wordList.add( currentWord );
  for( var j=i+1; j<words.Length; j++ )
  {
    currentWord += " " + words[j];
    wordList.Add( currentWord );
  }
}

Вы также можете использовать string.Format или StringBuilder, если хотите стать Мелвином и получить дополнительный кредит ...

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