2010-03-08 158 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