Алгоритм не из идеальных. Но в песочнице отрабатывает все найденные варианты входных данных тут, на этом сайте. И на русском, и на английском.
И большие цепочки, и малые, все, которые нашел, в песочнице через файл отработали замечательно.
Если я в 37 или 53 строке убираю в левом выражении isLowerCase(), т.е. пишу:
if (words[i].charAt(words[i].length() - 1) ....)
то валидатор при проверке выбрасывает TimeOut. Если оставляю, то не прохожу по 5-му пункту. При этом сами слова я нигде не меняю, ну или не вижу, что меняю...
Алгоритм дубовый: перемешиваю набор входных слов до тех пор, пока не получу цепочку, из которой могу пузырьком пересортировать слова по нужному условию. Т.к. ограничений по времени нет, то проблем быть не должно даже с условно большим списком. Список из 30-35 слов сортировался раз 100, пока не нашел вариант, но это мгновенно происходит.
Алгоритм работает даже на "страшной" последовательности из:
трам Нет труД муд доМ мандарин март
за 11 перетасовок выдает ответ:
мандарин Нет трам муд доМ март труД
package com.javarush.task.task22.task2209;
import java.io.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/*
Составить цепочку слов
*/
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader fileReader = new BufferedReader(new FileReader(reader.readLine()));
StringBuilder data = new StringBuilder();
while (fileReader.ready()){
data.append(fileReader.readLine());
}
reader.close();
fileReader.close();
String[] words = data.toString().split(" ");
StringBuilder result = getLine(words);
System.out.println(result.toString());
}
public static StringBuilder getLine(String... words) {
StringBuilder out = new StringBuilder("");
if (words.length == 0){
return out;
}
while (!isReplaced(words)){
shuffle(words);
for (int i = 0; i < words.length - 1; i++){
for (int j = i + 1; j < words.length ; j++){
if (words[i].toLowerCase().charAt(words[i].length() - 1) == words[j].toLowerCase().charAt(0)){
String temp = words[i+1];
words[i + 1] = words[j];
words[j] = temp;
break;
}
}
}
}
for (String word: words){
out.append(word).append(" ");
}
return new StringBuilder(out.toString().substring(0, out.length() - 1));
}
private static boolean isReplaced(String[] w){
for(int i = 0; i < w.length - 1; i++){
if (w[i].toLowerCase().charAt(w[i].length() - 1) != w[i+1].toLowerCase().charAt(0)){
return false;
}
}
return true;
}
private static void shuffle(String[] words){
List<String> list = Arrays.asList(words);
Collections.shuffle(list);
list.toArray(words);
}
}