У меня есть код для генерации перестановки строки определенной длины, он не работает для abcdefghijklmnopqrstuvwxyz и ввода 7

#java #permutation #string-length

#java #перестановка #длина строки

Вопрос:

Я получаю эту ошибку для приведенного ниже ввода, пожалуйста, предложите любой другой код.

 abcdefghijklmnopqrstuvwxyz
7
  

Ошибка:

 Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.StringBuilder.toString(Unknown Source)
at aaa.c.generateCombination(c.java:24)
at aaa.c.generateCombination(c.java:24)
at aaa.c.generateCombination(c.java:24)
at aaa.c.generateCombination(c.java:24)
at aaa.c.generateCombination(c.java:24)
at aaa.c.generateCombination(c.java:24)
at aaa.c.generateCombination(c.java:24)
at aaa.c.main(c.java:37)
  

он работает для:

 abcdefghijklmnopqrstuvwxyz
5
  

пакет aaa;

 import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

class c {
    static int c;
    List<String> permutations = new LinkedList<String>();
    Scanner sc=new Scanner(System.in); 
    String input =sc.nextLine();
    int conbinationSize = sc.nextInt();
    boolean[] isChoosed = new boolean[input.length()];
    public void generateCombination(String partialOutput) {
        if (partialOutput.length() == conbinationSize) {
            permutations.add(partialOutput);
            c  ;
            return;
        }
        for (int i = 0; i < input.length();   i) {
            if (!isChoosed[i]) {
                isChoosed[i] = true;
                generateCombination(partialOutput   input.charAt(i));
                isChoosed[i] = false;      
            }
        }
    }

    void printCombination() {
        for (String c : permutations) {
            System.out.println(c);         
        }
    }
    public static void main(String[] args) {
        c dfs = new c();
        dfs.generateCombination("");
        dfs.printCombination();
        System.out.println(c);
    }
}
  

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

1. Глубокая рекурсия, запустите отладчик и получайте удовольствие 🙂

2. @Whatzs Я бы не назвал глубину рекурсии в семь «глубоких»

Ответ №1:

При запуске с размером пять, он помещает 26*25*24*23*22=7 893 600 строки в вашем списке.

При запуске с размером семь, он попытается поместить 26*25*24*23*22*21*20 = 3 315 312 000 строки в вашем списке. Каждая строка содержит массив из 7 символов, поэтому составляет около 34 байт. Выделяли ли вы 100 ГБ для своей виртуальной машины Java при ее запуске?

Реально, вам лучше использовать генератор / итератор для создания комбинаций и перестановок, передавая функцию, которая что-то делает с комбинацией, а не просто сохраняет ее, или записывает их в поток, а не работает с ними в памяти.