Всем привет :) Мой код к задаче прикреплен. Спустя 3 часа решения задачи понял, что в списке слов могут быть лишние слова / слово, для этого есть метод, который возвращает их список для того, чтоб в основном методе прикрепить его в конец. В целом, на примере из задачи, вывод совпадает с тем, что требуется, однако последний пункт валидатора не согласен. Мб я что-то упустил. Если есть возможность намекнуть, в какую сторону думать - буду очень рад, всем заранее спасибо =)
package com.javarush.task.task22.task2209;
import java.io.*;
import java.util.*;
/*
Составить цепочку слов
*/
public class Solution {
public static void main(String[] args) {
ArrayList<String> words = new ArrayList<>();
try (BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader fileReader = new BufferedReader(new FileReader(consoleReader.readLine()))) {
while (fileReader.ready()) {
words.addAll(Arrays.asList(fileReader.readLine().split(" ")));
}
} catch (IOException e) {
e.printStackTrace();
}
String[] result = getListWithRightOrder(words, getRedundantWords(words)).toArray(new String[0]);
System.out.println(getLine(result));
}
public static StringBuilder getLine(String... words) {
if (words.length == 0) return new StringBuilder();
StringBuilder result = new StringBuilder();
for (String word : words) {
result.append(word).append(" ");
}
return result.deleteCharAt(result.length() - 1);
}
public static ArrayList<String> getRedundantWords(ArrayList<String> list) {
if (list.size() == 0) return new ArrayList<>();
ArrayList<String> redundantWords = new ArrayList<>();
for (int i = 0; i < list.size();) {
boolean isRedundant= true;
String currentWord = list.get(i);
for (int j = 0; j < list.size();) {
String comparedWord = list.get(j);
if (areLettersCoincide(currentWord, comparedWord) && i != j) {
isRedundant = false;
i++;
break;
} else {
j++;
}
}
if (isRedundant) {
redundantWords.add(currentWord);
list.remove(currentWord);
}
}
return redundantWords;
}
public static boolean areLettersCoincide(String word1, String word2) {
char word1FirstLetter = word1.toLowerCase().charAt(0);
char word1LastLetter = word1.toLowerCase().charAt(word1.length() - 1);
char word2FirstLetter = word2.toLowerCase().charAt(0);
char word2LastLetter = word2.toLowerCase().charAt(word2.length() - 1);
return word1FirstLetter == word2LastLetter || word1LastLetter == word2FirstLetter;
}
public static ArrayList<String> getListWithRightOrder(ArrayList<String> list, ArrayList<String> redundantWords) {
if (list.size() == 0) return new ArrayList<>();
ArrayList<String> resultingList = new ArrayList<>();
list.removeAll(redundantWords);
resultingList.add(list.get(2));
list.remove(2);
for (int i = 0; i < list.size();) {
String currentWord = resultingList.get(resultingList.size() - 1);
String comparingWord = list.get(i);
if (isNeighbour(currentWord, comparingWord)) {
resultingList.add(comparingWord);
list.remove(comparingWord);
i = 0;
} else {
i++;
}
}
resultingList.addAll(redundantWords);
return resultingList;
}
public static boolean isNeighbour(String first, String second) {
char lastLetter = first.toLowerCase().charAt(first.length() - 1);
char firstLetter = second.toLowerCase().charAt(0);
return lastLetter == firstLetter;
}
}