我有一個字符串,如「大壞狗」,我怎樣才能得到一個字符串[]數組,其中包括所有可能的單詞/短語組合?在c中生成字組合數組#
所以,我想返回「大」,「壞」,「狗」,「大壞」,「壞狗」和「大壞狗」 - 因此原始字符串中單詞的順序必須受到尊重。
這是可以用正則表達式完成的事情嗎?
我有一個字符串,如「大壞狗」,我怎樣才能得到一個字符串[]數組,其中包括所有可能的單詞/短語組合?在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();
}
}
A 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);
}
編輯:不,它不能使用只有一個正則表達式。
編輯:每Eric Lippert,改變面具ulong(UInt64)。
這解決了這個問題,但沒有完全回答OP的問題。 – 2010-03-08 14:09:30
如果有超過32個字怎麼辦? (我知道,這需要花費一些時間才能通過前40億美元,但現在機器很快。) – 2010-03-08 15:03:00
什麼分割字符串成單獨的單詞
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); }
我覺得正規表示沒有使用此陣。
這解決了問題,但沒有完全回答OP的問題。 – 2010-03-08 14:09:53
它不?請,我可以這樣離開嗎,老師太太? – Machta 2010-03-08 14:29:58
「大狗」呢?因爲它仍然保留排序,但忽略中間詞。 – Josh 2010-03-08 13:28:58
我最近做了一個類似「暴力破解」的例程,但它使用了字母。它不使用正則表達式,或者我會在這裏發佈 – Marcelo 2010-03-08 13:30:37
當你學習正則表達式時,一切看起來像一個釘子... – cjk 2010-03-08 14:30:26