2016-03-22 2 views
-2

Я пытался найти лучший подход к объединению слов в строке, чтобы сделать комбинации этой строки. Я пытаюсь сделать это для класса проекта. Если строка «Быстрая лиса», мне нужно найти способ вывода «Thequick fox», «quickfox» и «thequickfox». Я пробовал использовать string.split и склеивать их вместе, но не имел большой удачи. Проблемы - это строковый ввод может иметь любой размер.Как удалить пробелы, чтобы сделать комбинацию строк

+1

Можете ли вы показать нам свои текущие попытки и где, в частности, они терпят неудачу? – Rob

+1

Вам нужно будет вывести комбинации 2^(n - 1), где 'n' - количество слов. Он будет работать в допустимое время, если 'n <= 30'. Я предлагаю взять итератор маски и посетить все значения от 0 до 2^(n - 1), вы построите комбинацию, проверьте 'i'-th бит, чтобы увидеть, должно ли присутствовать' i'-th пространство. –

ответ

0

Я решил попробовать это для удовольствия. Идея здесь состоит в том, чтобы разделить большие проблемы на более мелкие подзадачи. Поэтому я сначала начал с строк, которые имели 0 и 1 место. Я вижу, что с 0 пробелом единственными возможными комбинациями являются строковые элементы. Имея 1 пробел, я могу либо иметь это пространство, либо нет.

Тогда мне просто нужно рекурсивно разделить проблему, пока я не получу один из базовых корпусов. Таким образом, для этого сделайте так, чтобы элементы в массиве split с шагом 2. Таким образом, я гарантированно получу один из базовых вариантов. Как только я это сделаю, я снова запускаю его через программу и выясняю, как добавить все результаты этого в мой текущий набор комбинаций.

Вот код:

class Program 
{ 

    static void Main(string[] args) 
    { 
     string test1 = "fox"; 
     string test2 = "The quick"; 
     string test3 = "The quick fox"; 
     string test4 = "The quick fox says"; 
     string test5 = "The quick fox says hello"; 

     var splittest1 = test1.Split(' '); 
     var splittest2 = test2.Split(' '); 
     var splittest3 = test3.Split(' '); 
     var splittest4 = test4.Split(' '); 
     var splittest5 = test5.Split(' '); 

     var ans1 = getcombinations(splittest1); 
     var ans2 = getcombinations(splittest2); 
     var ans3 = getcombinations(splittest3); 
     var ans4 = getcombinations(splittest4); 
     var ans5 = getcombinations(splittest5); 
    } 




    static List<string> getcombinations(string[] splittest) 
    { 
     var combos = new List<string>(); 
     var numspaces = splittest.Count() - 1; 
     if (numspaces == 1) 
     { 
      var addcombos = AddTwoStrings(splittest[0], splittest[1]); 
      var withSpacesCurrent = addcombos.Item1; 
      var noSpacesCurrent = addcombos.Item2; 
      combos.Add(withSpacesCurrent); 
      combos.Add(noSpacesCurrent); 
     } 
     else if (numspaces == 0) 
     { 
      combos.Add(splittest[0]); 
     } 
     else 
     { 
      var addcombos = AddTwoStrings(splittest[0], splittest[1]); 
      var withSpacesCurrent = addcombos.Item1; 
      var noSpacesCurrent = addcombos.Item2; 
      var futureCombos = getcombinations(splittest.Skip(2).ToArray()); 
      foreach (var futureCombo in futureCombos) 
      { 
       var addFutureCombos = AddTwoStrings(withSpacesCurrent, futureCombo); 
       var addFutureCombosNoSpaces = AddTwoStrings(noSpacesCurrent, futureCombo); 

       var combo1 = addFutureCombos.Item1; 
       var combo2 = addFutureCombos.Item2; 
       var combo3 = addFutureCombosNoSpaces.Item1; 
       var combo4 = addFutureCombosNoSpaces.Item2; 

       combos.Add(combo1); 
       combos.Add(combo2); 
       combos.Add(combo3); 
       combos.Add(combo4); 
      } 
     } 



     return combos; 
    } 

    static Tuple<string, string> AddTwoStrings(string a, string b) 
    { 
     return Tuple.Create(a + " " + b, a + b); 
    } 

} 
} 
0

Это, как я получил это работает, не уверен, что это лучший алгоритм.

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Console.WriteLine("Enter a string"); 

     string input = Console.ReadLine(); 

     //split the input string into an array 
     string[] arrInput = input.Split(' '); 

     Console.WriteLine("The combinations are..."); 

     //output the original string 
     Console.WriteLine(input); 

     //this loop decide letter combination 
     for (int i = 2; i <= arrInput.Length; i++) 
     { 
      //this loop decide how many outputs we would get for a letter combination 
      //for ex. we would get 2 outputs in a 3 word string if we combine 2 words 
      for (int j = i-1; j < arrInput.Length; j++) 
      { 
       int end = j; // end index 
       int start = (end - i) + 1; //start index 

       string output = Combine(arrInput, start, end); 

       Console.WriteLine(output); 
      } 
     } 

     Console.ReadKey(); 
    } 

    //combine array into a string with space except from start to end 
    public static string Combine(string[] arrInput, int start, int end) { 
     StringBuilder builder = new StringBuilder(); 
     bool combine = false; 

     for (int i = 0; i < arrInput.Length; i++) { 
      //first word in the array... don't worry 
      if (i == 0) { 
       builder.Append(arrInput[i]); 
       continue; 
      } 
      //don't append " " if combine is true 
      combine = (i > start && i <= end) ? true : false; 

      if (!combine) 
      { 
       builder.Append(" "); 
      } 
      builder.Append(arrInput[i]); 
     } 

     return builder.ToString(); 
    } 
} 
+0

Ваш код не дает случай оригинальной строки, когда у вас есть строка ввода, как «Быстрая лиса говорит привет» – Ringil

+0

Спасибо. Я отредактировал его. – vabii

Смежные вопросы