Распечатать с двумя условиями - PullRequest
0 голосов
/ 07 января 2020

Я написал этот код, который должен печатать все возможные строки (длина 4) комбинации (a, b, c, d) с двумя условиями:

  1. a всегда должно следовать b
  2. a и d не могут быть в одной строке

Когда я запускаю следующий код, он дает мне "

aaaa
Exception in thread "main" java.lang.StackOverflowError

" ... Я не уверен, что я сделал не так. Спасибо за вашу помощь !

    static void printAllKLength(char[] set, int k) {
    int n = set.length;
    printAllKLengthRec(set,"", n, k);
}

static void printAllKLengthRec(char[] set, String prefix, int n, int k) {
    if (k == 0) {
        if (aFollowsB(prefix) && hasOnlyAOrD(prefix) == true) {
            System.out.println(prefix);
            return;

        }
    }
    for (int i = 0; i < n; ++i) {
        String newPrefix = prefix + set[i];
        printAllKLengthRec(set, newPrefix, n, k - 1);
    }
}

//Method for "a" always have to follow "b"
public static boolean aFollowsB(String str) {
    return str.indexOf('a') > str.indexOf('b');
}

//Method for "we can't have a and d in the same string"
public static boolean hasOnlyAOrD(String str) {
    return str.indexOf('a') == -1 || str.indexOf('d') == -1;
}

//Main method
public static void main(String[] args) {
    char[] set1 = { 'a', 'b', 'c', 'd' };
    int k = 4;
    printAllKLength(set1, k);
}}

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Это мое окончательное решение :) Спасибо за помощь!

   static void printAllKLength(char[] set, int k) {
        int n = set.length;
        printAllKLengthRec(set,"", n, k);
    }

static void printAllKLengthRec(char[] set, String prefix, int n, int k) {
    if (k == 0) {
        if (aSuitB(prefix) && soitAouD(prefix) == true) {
            System.out.println(prefix);


        }  return;
    }
    for (int i = 0; i < n; ++i) {
        String newPrefix = prefix + set[i];
        printAllKLengthRec(set, newPrefix, n, k - 1);
    }
}

//Methode "a" doit toujours suivre "b"
public static boolean aSuitB(String s) {
      char[] set1 = s.toCharArray();

      for (int i = 0; i < set1.length; i++) {
        // Si B est le dernier char, A ne peut pas suivre.
        if (i == set1.length - 1) {
          if (set1[i] == 'b') { return false; }
        // Pour le reste, si on rencontre B, s’assurer que A suit.
        } else {
          if (set1[i] == 'b') {
            if (set1[i+1] != 'a') { return false; }
          }
        }
      }

      return true;
    }



//Methode pour « on ne peut avoir a et d dans le même string »
public static boolean soitAouD(String s) {
      char[] set1 = s.toCharArray();

      boolean hasA = false;
      boolean hasD = false;

      for (int i = 0; i < set1.length; i++) {
        if (set1[i] == 'a') {
          hasA = true;
        } else if (set1[i] == 'd') {
          hasD = true;
        }
      }

      if (hasA && hasD) {
        return false;
      }

      return true;
    }

//Main method
public static void main(String[] args) {
    char[] set1 = { 'a', 'b', 'c', 'd' };
    int k = 4;
    printAllKLength(set1, k);
}}
0 голосов
/ 07 января 2020

Просто перенесите свое возвращение за пределы l oop. Если a не следует b, у вас будет бесконечная рекурсия.

Теперь это исправляет вашу ошибку stackOverflow - но у вас все еще могут быть некоторые проблемы с logi c в зависимости от о том, как вы хотите обрабатывать несколько вхождений a после b или как обрабатывать a после b, если нет b.

static void printAllKLengthRec(char[] set, String prefix, int n, int k) {
    if (k == 0) {
        if (aFollowsB(prefix) && hasOnlyAOrD(prefix)) {
            System.out.println(prefix);
        }

        return; // ALWAYS return now
    }
    for (int i = 0; i < n; ++i) {
        String newPrefix = prefix + set[i];
        printAllKLengthRec(set, newPrefix, n, k - 1);
    }
}
...