проверял с несколькими вариантами наборов слов, все сработали корректно
алгоритм в двух словах:
1. вставляем первое слово, строим цепочку начиная с этого слова
2. каждое вставленное слово превращаем в нулл, что б не использовать повторно
3. проверяем, если в массиве остались слова не равны нулл, значит они не были вставлены в массив, соотвественно массив
отсортирован некорректно, начинаем сначала но меняем первое слово в цепочке
4. если все слова нулл, возвращаем список
если аргументом передан набор слов в котором нет правильного варианта расстановки слов, таким образом, что бы они все были задействованы
выбрасывается исключение
вообще не пойму как последный пункт проходит, а предпоследний нет🤨
package com.javarush.task.task22.task2209;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.io.*;
import java.util.*;
/*
Составить цепочку слов
*/
public class Solution {
public static void main(String[] args) throws IOException
{
//...
BufferedReader readPath = new BufferedReader(new InputStreamReader(System.in));
BufferedReader reader = new BufferedReader(new FileReader(readPath.readLine()));
readPath.close();
List<String> words = new ArrayList<>();
while(reader.ready())
{
String s = reader.readLine();
Collections.addAll(words, s.split(" "));
}
reader.close();
StringBuilder result = getLine(words.toArray(new String[0]));
System.out.println(result.toString());
}
public static StringBuilder getLine(String... word)
{
String[] words = word.clone();
StringBuilder builder = new StringBuilder("");
// если переданных аргументов нету возвращаем пустой стрингБилдер
if(words.length == 0) return builder;
else if(words.length == 1) return builder.append(words[0]);
int count = 0; // счетчик первого слова в отсортированном списке
while (true)
{
// проверяем в цикле все ли слова в массиве были использованы
for(int i = 0; i < words.length; i++)
{
// если встречаем не нулл слово значит список был составлен
// не верно, начинаем сначала, но уже первым словом в списке
// ставим второй аргумент, потом третий и тд (для этого используем count)
if(words[i] != null)
{
count++;
// возобновляем массив и чистим стрингБилдер
words = word.clone();
builder = new StringBuilder("");
break;
}
// если дошли до последнего элемента в цикле
// значит все слова были нулл, список составлен верно
// все слова используються в списке
//возращаем список и выходим из метода
if(i == words.length-1) return builder;
}
// вставляем первое слово в список
builder.append(words[count]+" ");
// запоминаем последнюю букву первого слова
char c = words[count].charAt(words[count].length()-1);
// превращаем слово в нулл, что б не использовать повторно
words[count] = null;
char c2; // для первой буквы следующего слова
for(int i = 0; i < words.length; i++)
{
if(words[i] == null) continue;
for(int j = 0; j < words.length; j++)
{
if(words[j] == null) continue;
c2 = words[j].charAt(0);
// если последня буква предыдущего слова
// и первая буква следующего слова совпадают
if(equalsChar(c, c2))
{
// добавляем это слово в список
builder.append(words[j]+" ");
// сохраняем теперь последнюю букву нового слова
c = words[j].charAt(words[j].length()-1);
// и превращаем слово в нулл что б не использовать повторно
words[j] = null;
}
}
}
}
}
static boolean equalsChar(char ch, char ch1)
{
int difference = 'A' - 'a';
return ch == ch1 || ch1 == (ch + difference) || ch == (ch1 + difference);
}
}