我需要取一串单词,可以是任意数量的单词,并创建从第一个单词到最后一个单词的所有可能组合的数组。
示例输入:(输入可以是任意数量的单词,分隔符是空格
“word1 word2 word3”
输出:
1: word1
2: word1 word2
3: word1 word2 word3
4: word2
5: word2 word3
6: word3
任何语言都可以,但更喜欢c#
答案 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<<w)-1
计算,其中w
是字数。答案 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(" "));
}