解析出所有单词组合

时间:2011-02-01 16:08:41

标签: string parsing

我需要取一串单词,可以是任意数量的单词,并创建从第一个单词到最后一个单词的所有可能组合的数组。

示例输入:(输入可以是任意数量的单词,分隔符是空格

“word1 word2 word3”

输出:

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

任何语言都可以,但更喜欢c#

4 个答案:

答案 0 :(得分:1)

Haskell,只因为它很漂亮(至少与C系列相比)并且你说过任何语言:

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

可以像这样调用:

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

或者像这样,如果你真的必须传递一个以空格分隔的字符串:

combinations (words "word1 word2 word3")

答案 1 :(得分:0)

听起来像是一个家庭作业问题。

使用string.split然后使用两个for循环。

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 );
  }
}

如果你想成为Melvin并获得额外的信用,你也可以使用string.Format或StringBuilder ......

答案 2 :(得分:0)

一种简单的方法是

  1. 1(1<<w)-1计算,其中w是字数。
  2. 对于计数器的每个值,考虑值的各个位,如果第n位置位,则考虑第n个字,否则跳过它。

答案 3 :(得分:0)

将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(" "));
}