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

时间:2010-03-08 13:24:07

标签: c# regex

我有一个字符串,例如“大坏狗”,如何获得包含所有可能的单词/短语组合的字符串[]数组?

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

这可以用正则表达式完成吗?

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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();
        }
} 

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

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

答案 2 :(得分: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); 
}

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