Code works with the example, but it doesn't pass last two requirements. Can someone help me?
If it's not possible to to build chain from all words, what should it returns?
package com.codegym.task.task22.task2209;
/*
Make a word chain
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Solution {
public static void main(String[] args) {
List<String> fileWords = new ArrayList<>();
String fileName = "";
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
fileName = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
try (BufferedReader fileReader = new BufferedReader(new FileReader(fileName))) {
while (fileReader.ready()) {
String line = fileReader.readLine();
String[] split = line.split(" ");
fileWords.addAll(Arrays.asList(split));
}
} catch (IOException e) {
e.printStackTrace();
}
StringBuilder result = getLine(fileWords.toArray(new String[0]));
System.out.println(result.toString());
}
public static StringBuilder getLine(String... words) {
if (words.length == 0) {
return new StringBuilder();
}
if (words.length == 1) {
return new StringBuilder(words[0]);
}
List<StringBuilder> chainsList = new ArrayList<>();
StringBuilder wordChain = new StringBuilder();
List<String> listWords = new ArrayList<>(Arrays.asList(words));
for (int k = 0; k < listWords.size(); k++) {
wordChain = new StringBuilder();
List<String> copyWords = new ArrayList<>(listWords);
Collections.swap(copyWords, 0, k);
int i = 0;
while (i < copyWords.size()) {
boolean addedToChain = false;
for (int j = 0; j < copyWords.size(); j++) {
if (i != j && isFirstWordEndingWithFirstLetterOfSecond(copyWords.get(i), copyWords.get(j))) {
if (!wordChain.toString().contains(copyWords.get(i))) {
wordChain.append(copyWords.get(i));
wordChain.append(" ");
}
wordChain.append(copyWords.get(j));
wordChain.append(" ");
Collections.swap(copyWords, i, j);
copyWords.remove(copyWords.get(j));
addedToChain = true;
j = 0;
}
}
if (wordChain.toString().length() > 0 && !wordChain.toString().equals(" ")) {
chainsList.add(wordChain);
}
if (!addedToChain) {
break;
}
}
}
int maxLength = -1;
for (StringBuilder chain : chainsList) {
if (chain.length() > maxLength) {
wordChain = chain;
maxLength = chain.length();
}
}
if (wordChain.toString().trim().split(" ").length < words.length) {
wordChain = new StringBuilder("");
// for (String word : words) {
// wordChain.append(word).append(" ");
// }
}
// return new StringBuilder(wordChain.toString().trim());
return wordChain;
}
public static boolean isFirstWordEndingWithFirstLetterOfSecond(String first, String second) {
return first.toLowerCase().endsWith(second.substring(0, 1).toLowerCase());
}
}