Эффективный способ найти комбинации строк в паре из двух, если строка является массивом

#java

#java

Вопрос:

Это то, что у меня есть до сих пор.

 package testproject;

public class Combinations{

      public Combinations(){

        String str_arr[]={"a","b","c"};
        GenCombinations(str_arr);
      }




      public void GenCombinations(String[] str_arr){

        System.out.println("Generating All possible Combinations for  the following " str_arr.length " strings.");        

        for(int i=0;i<str_arr.length;i  )
         {
            System.out.print(str_arr[i] " ");
         }
        System.out.println("n------------------------------------------");

        /*COMBINATIONS OF LENGTH ONE*/
        for(int i=0;i<str_arr.length;i  )
            System.out.println(str_arr[i]);        

        /*COMBINATIONS OF LENGTH TWO*/
        for(int i=0;i<str_arr.length;i  )
         {
           for(int j=0;j<str_arr.length;j  )
             {
                System.out.println(str_arr[i] "" str_arr[j]);                   
             }
         } 

        /*COMBINATIONS OF LENGTH THREE*/
        for(int i=0;i<str_arr.length;i  )
         {
          for(int j=0;j<str_arr.length;j  )
           {
            for(int k=0;k<str_arr.length;k  )
             {  
                System.out.println(str_arr[i] "" str_arr[j] "" str_arr[k]);                      
             }
           }
         }
      } 


      public static void main(String[] args){

        new Combinations();
      }
    }
  

Любые предложения будут оценены..

Комментарии:

1. для строки «ABCD» вы хотите разрешить «AAA» в качестве трехсимвольной подстроки? вы хотите разрешить «CBA» в качестве трехсимвольной подстроки?

2. Я хочу пару из двух, а не три… И никаких повторяющихся строк ..!!

3. @Raihan Jamal: Можете ли вы привести пример правильного вывода? Правильно ли работает ваш текущий код?

4. @RaihanJamal Это странно. Из вашего кода может показаться, что вам нужна длина 3.

5. Вывод, такой как ab, bc, ca и т. Д. И т. Д. Я тестировал с тремя, но мне не нужны три.

Ответ №1:

Если вам просто нужны комбинации из двух строк, то ваш код в основном настолько эффективен, насколько вы можете получить, со следующими оговорками:

  • Вы должны быть уверены, что входной массив не содержит дубликатов.

  • Если строки во входном массиве не все имеют одинаковую длину, вам может потребоваться проверить наличие дубликатов в выходном массиве.

Ответ №2:

Если вы хотите сгенерировать все возможные подстроки длины k из заданного алфавита, то то, что вы делаете, в значительной степени оптимально.

Если вы хотите сгенерировать все возможные комбинации длины k из заданного набора (или алфавита) с n элементами ( C(n, k) ) , то классическим решением является использование алгоритма Розена.

Например, учитывая 5-буквенный алфавит, если вы хотите одновременно использовать 3 комбинации, суть этого в том, чтобы считать так:

 012
013
014
023
024
034
123
.
.
.
  

Вот моя реализация a RosenIterator в Java.