在c#中生成单词组合数组

我有一个字符串,如“大坏狗”,我怎么能得到一个字符串[]数组,其中包括所有可能的单词/短语组合?

所以,我想返回“大”,“坏”,“狗”,“大坏”,“坏狗”和“大坏狗” – 因此必须尊重原始字符串中单词的顺序。

这是用正则表达式完成的吗?

我认为这是递归求解的一个很好的问题。 我的看法:

public static String[] findWords(params string[] args) { if (args.Count() == 0) { return new String[] { "" }; } else { String[] oldWords = findWords(args.Skip(1).ToArray()); String[] newWords = oldWords.Where(word => word == "" || word.Split(new String[] { " " }, StringSplitOptions.RemoveEmptyEntries)[0] == args[1]) .Select(word => (args[0] + " " + word).Trim()).ToArray(); return oldWords.Union(newWords).ToArray(); } } 

findWords("big", "bad", "dog")返回您的短语列表。

编辑:编辑为仅包含连续短语。

 string[] array = new string[]{"big", "bad", "dog"}; for(ulong mask = 0; mask < (1ul << array.Length); mask++) { string permutation = ""; for(int i = 0; i < array.Length; i++) { if((mask & (1ul << (array.Length - 1 - i))) != 0) { permutation += array[i] + " "; } } Console.WriteLine(permutation); } 

编辑:不,仅使用一个正则表达式无法完成。

编辑:Per Eric Lippert,将面具更改为ulong(UInt64)。

将字符串拆分为单独的单词数组怎么样?

 string str = "big fat dog"; string[] words = str.Split(new Char[] { ' ', ',', '.', ':', '\t' }); 

然后你可以用它来组合单词

 string[] words = new string[]{"big", "bad", "dog"}; for(int mask = 0; mask < 1 << (words.Length); mask++) { string permutation = ""; for(int i = 0; i < words.Length; i++) { if((mask & (1 << (words.Length - 1 - i))) != 0) { permutation += words[i] + " "; } } Console.WriteLine(permutation); } 

我认为正常的表达在这里没用。