Generate word combination array in c#

前端 未结 3 646
闹比i
闹比i 2021-01-13 06:37

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\"

相关标签:
3条回答
  • 2021-01-13 07:26

    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 讨论(0)
  • 2021-01-13 07:27
    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).

    0 讨论(0)
  • 2021-01-13 07:37

    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.

    0 讨论(0)
提交回复
热议问题