Доброго времени суток, коллеги!
Дошли руки до одной из не самых лёгких алгоритмических задач курса. Думал, справлюсь... ан нет, не пропускает
Помимо набора тегов из примера я тестировал свой код вот на таком:
<tag a>
<tag a1>
<tag a11>a11</tag>
<tag a12>a12</tag>
<tag a13>a13</tag>
</tag>
<tag a2>
<tag a21>a21</tag>
<tag a22>a22</tag>
<tag a23>a23</tag>
</tag>
</tag>
<tag></tag>
<tag b>
<tag b1>b1</tag>
<tag b2>b2</tag>
</tag>
можно скопировать без переносов строк: <tag a><tag a1><tag a11>a11</tag><tag a12>a12</tag><tag a13>a13</tag></tag><tag a2><tag a21>a21</tag><tag a22>a22</tag><tag a23>a23</tag></tag></tag><tag></tag><tag b><tag b1>b1</tag><tag b2>b2</tag></tag>
Вывод абсолютно корректный:
<tag a><tag a1><tag a11>a11</tag><tag a12>a12</tag><tag a13>a13</tag></tag><tag a2><tag a21>a21</tag><tag a22>a22</tag><tag a23>a23</tag></tag></tag>
<tag a1><tag a11>a11</tag><tag a12>a12</tag><tag a13>a13</tag></tag>
<tag a11>a11</tag>
<tag a12>a12</tag>
<tag a13>a13</tag>
<tag a2><tag a21>a21</tag><tag a22>a22</tag><tag a23>a23</tag></tag>
<tag a21>a21</tag>
<tag a22>a22</tag>
<tag a23>a23</tag>
<tag></tag>
<tag b><tag b1>b1</tag><tag b2>b2</tag></tag>
<tag b1>b1</tag>
<tag b2>b2</tag>
Также я протестировал код из "правильного" решения, и вот что у него оказалось в первом куске:
<tag a><tag a1><tag a11>a11</tag><tag a12>a12</tag><tag a13>a13</tag></tag>
Как видим, глубины проработки здесь уже не хватает.
Но тогда верно ли я понимаю — чтобы валиднуться, мне остаётся лишь скопировать код (заведомо неверный) из решения?
Или всё же, задача решена неверно? Тогда будьте добры, подскажите пример ввода, который мой код бы обрабатывал некорректно.
(inb4 варианты, где помимо [tag] дополнительно есть теги [tagElse][/tagElse] — во-первых, это должно было быть обозначено условием, во-вторых, "правильное" решение этого так же не учитывает)package com.javarush.task.task19.task1918;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
/*
Знакомство с тегами
*/
public class Solution {
public static void main(String[] args) {
//args = new String[]{"tag"};
String content = "";
//String fileName = "B:\\DEV\\IOFILES\\tasks\\1918\\file.html";
try (BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
FileReader fileReader = new FileReader(consoleReader.readLine())) {
//FileReader fileReader = new FileReader(fileName)) {
StringBuilder sb = new StringBuilder();
char[] buffer = new char[10];
while (fileReader.read(buffer) != -1) {
sb.append(new String(buffer));
buffer = new char[10];
}
content = sb.toString();
} catch (IOException e) { e.printStackTrace(); }
String open = "<" + args[0];
int openLen = open.length();
String close = "</" + args[0] + ">";
int closeLen = close.length();
List<String> slices = new ArrayList<>();
Deque<String> deque = new ArrayDeque<>();
deque.push(content);
while (!deque.isEmpty()) {
String poll = deque.poll();
if (!poll.contains(open)) continue;
// division of input by the first close sequence
// 'head' is a first part without first open and its last close sequences when builded
// 'tail' + {open + head + close} = input
String head = poll.substring(poll.indexOf(open) + openLen, poll.indexOf(close));
String tail = poll.substring(poll.indexOf(close) + closeLen);
// count of 'open' substring entries to the head string
int opensInHead = getEntryCount(head,open);
// building of head -- adding to head its rest closing parts except last close sequence
StringBuilder headSb = new StringBuilder(head);
while (opensInHead-- > 0) {
String subtail = tail.substring(0, tail.indexOf(close));
// need to account -- closing part (subtail) can contain open sequence(s)
opensInHead += getEntryCount(subtail, open);
headSb.append(close).append(subtail);
tail = tail.substring(tail.indexOf(close) + closeLen);
}
head = headSb.toString();
deque.push(tail);
deque.push(head);
slices.add(open + head + close);
}
for (String slice : slices) {
System.out.println(slice);
}
}
public static int getEntryCount(String string, String substring) {
return (string.length() - string.replaceAll(substring, "").length())/substring.length();
}
}