Почитав про эту задачу, я понял, что нужно отталкиваться от графов. Решил пойти по такому пути. Сначала нахожу слово, у которого первая буква не будет похожа ни на одну последнюю букву других слов. Дальше уже зная первое слово, можно идти дальше, сравнивая последнюю букву текущего слова и первую следующего. Но так же нужно учитывать, сколько раз данная буква может быть использована. Вот в этом моменте я что-то не знаю как дальше оттолкнуться. Я завел вот счетчики, но они учитывают только текущее слово. Нужно еще сделать для последующего?
Пример входных данных Прага Амстердам Вена Мельбурн Афины Киев Нью-Йорк
Код у меня сейчас в бесконечном цикле, я это прекрасно знаю.
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{
//...
String fileName;
try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
fileName = reader.readLine();
}
List<String> list = new ArrayList<>();
try(BufferedReader buff = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)))) {
while (buff.ready()) {
list.addAll(Arrays.asList(buff.readLine().split(" ")));
}
}
StringBuilder result = getLine(list.get(0), list.get(1), list.get(2), list.get(3), list.get(4), list.get(5), list.get(6));
System.out.println(result.toString());
}
public static StringBuilder getLine(String... words) {
if (words.length == 0) {
return new StringBuilder();
}
StringBuilder stringBuilder = new StringBuilder();
List<String> list = new ArrayList<>(Arrays.asList(words));
List<String> list1 = new ArrayList<>();
int countStart = list.size();
int countEnd = list.size();
int defaults = list.size();
while (!list.isEmpty()) { //в данном цикле находим слово, которое будет первым в списке
for (int i = 0; i < list.size(); i++) {
String string = list.get(i);
if (countStart == 1 && list1.size() == 0) {
list1.add(list.get(i - 1));
list.remove(list.get(i - 1));
countEnd = defaults;
countStart = defaults;
break;
}
if (!list1.isEmpty() && countEnd == 5 && list1.get(list1.size() - 1).substring(list1.get(list1.size() - 1).length() - 1).equalsIgnoreCase(string.substring(0,1))) {
list1.add(string);
list.remove(string);
countEnd = defaults;
countStart = defaults;
continue;
} /*else if (!list1.isEmpty() && countEnd == 6 && list1.get(list1.size() - 1).substring(list1.get(list1.size() - 1).length() - 1).equalsIgnoreCase(string.substring(0,1))) {
list1.add(string);
list.remove(string);
countEnd = defaults;
countStart = defaults;
break;
}*/
String startChar = string.substring(0,1);
String endChar = string.substring(string.length() - 1);
for (int j = 0; j < list.size(); j++) {
String string1 = list.get(j);
if (!string.equals(string1)) {
String startChar1 = string1.substring(0,1);
String endChar1 = string1.substring(string1.length() - 1);
if (startChar.equalsIgnoreCase(endChar1)) {
countStart++;
} else {
countStart--;
}
if (endChar.equalsIgnoreCase(startChar1)) {
countEnd++;
} else {
countEnd--;
}
}
}
}
}
list1.forEach(s -> stringBuilder.append(s + " "));
return stringBuilder;
}
}