Скармливал на проверку и из файла, и прямой передачей методу самые разные комбинации слов из комментариев и других вопросов - всё, как будто бы работает. Я наверное упускаю что то очевидное.
Код, конечно, избыточен: обход массива происходит слишком много раз, но я хотел попробовать по возможности не использовать коллекции.
Надеюсь, комментарии сделают мой код более читаемым.
package com.javarush.task.task22.task2209;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
Составить цепочку слов
*/
public class Solution {
public static void main(String[] args) throws IOException {
//...
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader.readLine();
BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
StringBuilder fileContent = new StringBuilder();
while (fileReader.ready()){
fileContent.append(fileReader.readLine() + " ");
}
reader.close();
fileReader.close();
String[] contentWords = fileContent.toString().split(" ");
StringBuilder result = getLine(contentWords);
System.out.println(result.toString());
System.out.println(getLine("трам", "Нет", "труД", "муд", "доМ", "мандарин", "март"));
}
public static StringBuilder getLine(String... words) {
//проверка на правильный формат переданной строки
if(words == null || words.length == 0) return new StringBuilder("");
if(!words[0].isEmpty() && words.length == 1) return new StringBuilder(words[0]);
//маска массива флагов для каждого переданного элемента
Boolean[] flagMask = new Boolean[words.length];
StringBuilder maxResult = new StringBuilder();
int maxCount = 0;
//вход во внешний цикл
for (int k = 0; k < words.length; k++) {
//В начале каждой итерации все флаги необходимо выставить в положении true
Boolean[] flagArray = new Boolean[words.length];
for (int i = 0; i < flagArray.length; i++) {
flagArray[i] = true;
}
//Попытка составить цепочку слов, начиная со слова под индеком k
StringBuilder localResult = new StringBuilder(words[k]);
//Флаг слова должен стать false, чтобы он более не учитывался в составлении строки
flagArray[k] = false;
//Переменная count отражает количество слов в формируемой строке
int count = 1;
//Вложенным цикл проходит по всем словам в массиве после каждого
// добавленного слова и, если последний и первый символ равны при приведеннии к нижнему регистру
// и флаг = true, - добавляет слово в результирующую строку, меняет
// значение флага и увеличивает переменную count
for (int i = 0; i < words.length; i++) {
for (int j = 0; j < words.length; j++) {
if (flagArray[j] && (localResult.toString().toLowerCase().charAt(localResult.toString().length() - 1) == words[j].toLowerCase().charAt(0))) {
localResult.append(" " + words[j]);
flagArray[j] = false;
count++;
}
}
}
//Возврат сформированной строки, если использованы все слова
if (count == words.length)
return localResult;
//Если в локальная цепочка слов длиннее, чем сформированные ранее, то передаем её в maxResult, вместе с числом слов и маской флагов
if (count > maxCount) {
maxCount = count;
maxResult = localResult;
flagMask = flagArray;
}
}
//Возврат сформированной строки
return maxResult;
}
}