开发者

Generate word combination array in c#

I have a string such as "big bad dog", how can I get an string[] array which includes all the possible word/phrase combinations?

So, I would like to return "big", "bad", "dog", "big bad", "bad dog" and "big bad dog" - theref开发者_如何学Core the order of the words in the original string must be respected.

Is this something that could be done with a regular expression?


I think this is a nice problem to solve recursively. My take:

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") returns your list of phrases.

Edit: Edited to only include consecutive phrases.


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

EDIT: No, it can not be done using only a single regular expression.

EDIT: Per Eric Lippert, change masks to ulong (UInt64).


What about splitting the string into array of separate words

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

and then you can use this to make word combinations

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

I think regular expresion has no use here.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜