Всем здравствуйте! Пробовал с разными вариантами. Со своей цепочкой:
Кино Америка Велосипед Ацетон Кирпич Самолет Носорог Орео Горб Чебурег Бензин Брок Оса Нос Ябеда Динар Аврал Лев Великан Арка Улей Герб Сон Короб Нерв Революция Яблоня Блок Нота Арес Табу
Выполнилось в принципе довольно быстро. Это может не лучший по производительности алгоритм, но валидатор то с миллионом слов что ли проверяет?
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.*;
/*
Составить цепочку слов
*/
public class Solution {
public static void main(String[] args) throws IOException {
//...
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String file = bufferedReader.readLine();
List<String> stringList = new ArrayList<>();
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line = "";
while ((line = bufferedReader.readLine()) != null) {
String[] mas = line.split(" ");
for (String str : mas) {
stringList.add(str);
}
}
String[] mas_str = new String[stringList.size()];
for (int i = 0; i < mas_str.length; i++) {
mas_str[i] = stringList.get(i);
}
StringBuilder result = getLine(mas_str);
System.out.println(result.toString());
}
public static StringBuilder getLine(String... words) {
List<Integer> indlist = new ArrayList<>();
List<String> reslist = new ArrayList<>();
List<String> clonewords = new ArrayList<>();
int i, k = 0, count=0;
String strend = "", strbeg = "";
while (reslist.size() < words.length) {
Collections.addAll(clonewords, words);
reslist.add(words[k]);
indlist.add(k);
clonewords.remove(words[k]);
// конец первого слова
strend = words[k].substring(words[k].length() - 1);
while (true) {
//произвольный индекс [0, words.length)
i = (int) (Math.random() * words.length);
if (!indlist.contains(i)) {
//начало другого слова
strbeg = words[i].substring(0, 1).toLowerCase();
if (strend.equals(strbeg)) {
reslist.add(words[i]);
clonewords.remove(words[i]);
indlist.add(i);
strend = reslist.get(reslist.size() - 1).substring(reslist.get(reslist.size() - 1).length() - 1);
}
}
if (reslist.size()== words.length) break;
else
{
for (String s: clonewords) {
if (s.substring(0,1).toLowerCase().equals(strend)) count++;
}
if (count==0) {
reslist.clear();
indlist.clear();
clonewords.clear();
break;
}
count=0;
}
}
if (k==words.length-1) k=0; else k++;
}
return new StringBuilder(reslist.toString().substring(1, reslist.toString().length() - 1));
}
}