Я выделил жирным что ВООБЩЕ НЕ ПОНЯЛ. ОБЪЯСНИТЕ ПОЖАЛУЙСТА.
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.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/*
Составить цепочку слов
*/
public class Solution {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader fileReader = new BufferedReader(new InputStreamReader(new FileInputStream(reader.readLine())))) {
while (fileReader.ready()) {
list.add(fileReader.readLine());
}
} catch (IOException ignored) {
}
List<String> resultList = new ArrayList<>();
for (String line : list) {
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
resultList.add(tokenizer.nextToken());
}
}
StringBuilder result = getLine(getWords(resultList));
System.out.println(result.toString());
}
private static String[] getWords(List<String> list) {
String[] array = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i);
}
return array;
}
private static boolean isTheSameChars(String firstWord, String secondWord) {
if (firstWord.endsWith(" ")) {
firstWord = firstWord.substring(0, firstWord.length() - 1);
}
return firstWord.isEmpty() || (secondWord != null &&
Character.toUpperCase(firstWord.charAt(firstWord.length() - 1)) == Character.toUpperCase(secondWord.charAt(0)));
}
private static <T> T getLastElement(List<? extends T> list) {
return list.get(list.size() - 1);
}
public static StringBuilder getLine(String... words) {
StringBuilder builder = new StringBuilder();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < words.length; i++) {
list.add(i);
if (findSolutions(list, words)) {
for (Integer integer : list) {
builder.append(words[integer]);
builder.append(" ");
}
return builder;
}
list.remove(Integer.valueOf(i));//delete
}
return builder;
}
private static boolean findSolutions(List<Integer> list, String... words) {
if (list.size() == words.length) {
return true;
}
for (int i = 0; i < words.length; i++) {
if (isValid(list, words[i], words)) {
list.add(i);
if (findSolutions(list, words)) {
return true;
}
list.remove(Integer.valueOf(i));//delete
}
}
return false;
}
private static boolean isValid(List<Integer> list, String word, String... words) {
for (Integer integer : list) {
if (words[integer].equals(word)) {
return false;
}
}
return isTheSameChars(words[getLastElement(list)], word);
}
}
БелК в труселях
35 уровень
Доброе утро. Я очень долго пытался понять почему работает, но не понял. объясните разработчики или профессионалы. ЭТО РЕШЕНИЕ
Обсуждается
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Денис Enterprise Java Developer
11 февраля 2022, 14:41
findSolutions делает рекурсивный перебор элементов массива слов, и добавляет в массив int'ов координаты подходящих слов. Если размер списка координат такой же как и у списка слов - возвращается true. Дальше уже в методе getLines наполняется StringBuilder.
Метод isValid проверяет для всей текущей цепочки слов, что текущего проверяемого слова в ней не представлено, и если это так - возвращает результат проверки того, что элемент общего массива слов с последним индексом из цепочки слов имеет подходящую букву (последняя равна первой проверяемого слова).
Вообще я просто оставлю это здесь:
![]()

0
БелК в труселях
11 февраля 2022, 15:29
СПАСИБО ОГРОМНОЕ!!! То есть если я правильно понял то private static boolean isValid(List<Integer> list, String word, String... words) {
Проверяет правильность листа на соответствие задания. А основной перебор глубокий происходит в findSolutions???????
0