2016-03-22 17 views
-2

Bu dizenin birleşimlerini oluşturmak için bir dizede sözcükleri birleştirmeye en iyi yaklaşımı anlamaya çalışıyorum. Bunu bir sınıf projesi için yapmaya çalışıyorum. Dize "Hızlı tilki" ise, "Tilki tilkisi", "hızlı bağlantı" ve "thequickfox" için bir yol bulmam gerekiyor. String.split'i kullanmayı ve onları bir araya getirmeyi denedim, ama çok şansım olmadı. Sorunlar, string girişi herhangi bir boyutta olabilir.Dizeleri birleştirmek için boşluklar nasıl kaldırılır

+1

Bize şu anki denemelerinizi ve özellikle nerede başarısız olduklarını gösterir misiniz? – Rob

+1

2^(n - 1) kombinasyonlar kullanmalısınız; burada 'n' bir dizi sözcüktür. Eğer 'n <= 30' ise uygun zamanda çalışır. Bir maske yineleyici almayı ve 0 ile 2^(n - 1) arasındaki tüm değerleri ziyaret etmenizi öneririm, bir kombinasyon oluşturacaksınız, 'i'-th alanının bulunup bulunmadığını görmek için 'i' -sini kontrol edin. –

cevap

0

Bunu eğlenmek için denemeye karar verdim. Buradaki fikir, daha büyük sorunları daha küçük alt problemlere bölmektir. Bu yüzden ilk önce 0 ve 1 boşluk olan dizelerle başladım. Bunu 0 boşluk ile görüyorum, olası tek kombinasyonlar dize öğeleridir. 1 boşluk ile o alana sahip olabilirim ya da olmayabilir.

Ardından, temel durumlardan birini alana kadar sorunu yinelemeli olarak bölmem gerekiyor. Bu yüzden, 0'lık artışlarla bölünmüş dizideki Skip öğelerini yapıyorum. Bu şekilde, temel durumlardan birini almayı garanti ediyorum. Bunu yaptıktan sonra, programı tekrar çalıştırıyorum ve bunun tüm sonuçlarını mevcut kombinasyonlarıma nasıl ekleyeceğimi anladım.

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

Bu buna iyi algoritma olup olmadığından emin, çalışma var nasıl:

İşte kod.

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

"Hızlı tilki merhaba diyor" – Ringil

+0

Teşekkür olarak, giriş dizesi olduğunda kodunuz özgün dize durumunda vermez. Düzenledim. – vabii

İlgili konular