Пишу этот вопрос, обращаясь в первую очередь к разработчикам, ибо уверен, что кто то из вас, ребят, очень криво писал тесты.
Потратил на эту задачу суммарно часов 10 точно, ковыряясь что же не так, и по началу это было весело (реально нашёл пару косяков), но потом стало не смешно. И алгоритм отличный, на рекурсии, но валидатору всё не нравится.... Я пробовал даже переписать механизм чтения из файла, ибо посчитал, что, возможно, дело в кодировке или локализации, но, увы, нет.
Мне пришлось написать свой генератор всех возможных входных данных, который генерирует, например, для того набора слов из примера 5! = 120 возможных комбинаций порядков, в котором могут лежать те слова во входном файле. Мои тесты, показывают, что всё работает корректно для любого данного набора.
Проверить это можно поменяв в main при вызове метода run входной параметр на true.
А валидатор мне издевательски ещё пишет "Протестируй свое решение на примере из условия - все слова должны быть выведены на экран." 😒
package com.javarush.task.task22.task2209;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
/*
Составить цепочку слов
*/
public class Solution {
public static void main(String[] args) {
run(false);
}
public static void run(boolean isTest) {
if (isTest) {
Tests.runAllTests();
} else {
realProgram();
}
}
public static void realProgram() {
List<Word> words = new ArrayList<>();
try (Scanner scanner = new Scanner(System.in);
BufferedReader reader = new BufferedReader(new FileReader(scanner.nextLine()))
) {
while (reader.ready()) {
Word.addWords(reader.readLine().split(" "));
}
words = Word.allWords;
} catch (IOException e) {
e.printStackTrace();
}
//...
String[] s = new String[words.size()];
for (int i = 0; i < words.size(); i++) {
s[i] = words.get(0).string;
}
StringBuilder result = getLine(s);
System.out.println(result.toString().trim());
}
public static StringBuilder getLine(String... words) {
if (words.length == 0) {
return new StringBuilder();
}
List<Word> result = new ArrayList<>();
for (int i = 0; i < Word.allWords.size(); i++) {
List<Word> unusedWords = new ArrayList<>(Word.allWords);
Word firstWord = Word.findFirst(i);
// System.out.println(firstWord);
unusedWords.remove(firstWord);
Chain chain = new Chain(firstWord, unusedWords);
result = chain.run();
if (result.size() == Word.allWords.size()) break;
}
StringBuilder builder = new StringBuilder();
result.forEach(v -> builder.append(v.string).append(" "));
return builder;
}
}
Проверьте на такой строке: трам Нет труД муд доМ мандарин март Ноорка арка аа Варианты сборки "Нет трам март труД доМ мандарин Ноорка арка аа" "Нет трам март труД доМ мандарин Ноорка аа арка" "Нет труД доМ март трам мандарин Ноорка арка аа" "Нет труД доМ март трам мандарин Ноорка аа арка"