2010-03-08 148 views
5

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

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

这是可以用正则表达式完成的事情吗?

+2

“大狗”呢?因为它仍然保留排序,但忽略中间词。 – Josh 2010-03-08 13:28:58

+0

我最近做了一个类似“暴力破解”的例程,但它使用了字母。它不使用正则表达式,或者我会在这里发布 – Marcelo 2010-03-08 13:30:37

+2

当你学习正则表达式时,一切看起来像一个钉子... – cjk 2010-03-08 14:30:26

回答

6

我认为这是递归解决的一个很好的问题。我的拍摄:

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

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

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

+0

这解决了这个问题,但没有完全回答OP的问题。 – 2010-03-08 14:10:24

+0

真的,对不起。我保证在将来阅读更好=) – Jens 2010-03-08 14:26:07

+0

谢谢Jens,这几乎是我想要的。只有一个小问题(我没有在我原来的帖子中解释过),那是我只想要连续的单词或短语,所以“大狗”不应该是一个匹配。您可以对代码进行调整吗? – Stuart 2010-03-08 15:54:31

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

编辑:不,它不能使用只有一个正则表达式。

编辑:每Eric Lippert,改变面具ulong(UInt64)。

+0

这解决了这个问题,但没有完全回答OP的问题。 – 2010-03-08 14:09:30

+3

如果有超过32个字怎么办? (我知道,这需要花费一些时间才能通过前40亿美元,但现在机器很快。) – 2010-03-08 15:03:00

0

什么分割字符串成单独的单词

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

我觉得正规表示没有使用此阵。

+0

这解决了问题,但没有完全回答OP的问题。 – 2010-03-08 14:09:53

+0

它不?请,我可以这样离开吗,老师太太? – Machta 2010-03-08 14:29:58