тестовый ввод:
Info about Leela <span
xml:lang="en" lang="en"><span></span></b></span><span>Super</span><span></span>
код который проходит валидацию, выдает явно неверное решение:
<spanxml:lang="en" lang="en"><span></span></b></span>
<span></span>
<span>Super</span>
<span></span>
мой код выводит:
<span
xml:lang="en" lang="en"><span></span></b></span>
<span>Super</span>
<span></span>
ниже мой код:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
/*
Знакомство с тегами
*/
public class s1 {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String fileName = br.readLine();
isr.close();
br.close();
FileReader fr = new FileReader(fileName);
ArrayList<Character> charsList = new ArrayList<>();
while (fr.ready())
charsList.add((char) fr.read());
fr.close();
String tag = args[0];
int off = 0;
int[] b;
while (null != (b = betweenTags(tag, charsList, off))) {
System.out.println(subCharListToString(charsList, b[0], b[1]));
off = b[1];
}
}
static String subCharListToString(ArrayList<Character> lst, int off, int end) {
if (lst == null) return null;
if (lst.size() == 0) return "";
if (off < 0) off = 0;
if (end <= 0) return null;
int size = lst.size();
if (end > size) end = size;
char[] chars = new char[end - off];
for (int i = 0; i < chars.length; i++)
chars[i] = lst.get(off + i).charValue();
return String.copyValueOf(chars);
}
static String subCharListToString(ArrayList<Character> lst, int off) {
if (lst == null) return null;
return subCharListToString(lst, off, lst.size());
}
static String subCharListToString(ArrayList<Character> lst) {
if (lst == null) return null;
return subCharListToString(lst, 0, lst.size());
}
static int[] betweenTags(String tag, ArrayList<Character> charsList, int off) {
int[] open1 = findBoundariesOpeningTag(tag, charsList, off);
if (open1 == null)
return null;
int[] close = findBoundariesСlosingTag(tag, charsList, open1[1]);
if (close == null)
return null;
int[] open2 = findBoundariesOpeningTag(tag, charsList, open1[1]);
if ((open2 == null) || (open2[0] > close[0]))
return new int[]{open1[0], close[1]};
int[] bts = betweenTags(tag, charsList, open1[1]);
if (bts == null) return null;
close = findBoundariesСlosingTag(tag, charsList, bts[1]);
if (close == null) return null;
return new int[]{open1[0], close[1]};
}
static boolean isSubset(String str, ArrayList<Character> charsList, int off) {
if (str == null) return false;
if (charsList == null) return false;
if (off < 0) return false;
if (off >= charsList.size()) return false;
if (str.length() == 0) return true;
if (charsList.size() == 0) return false;
if (charsList.size() < (off + str.length()))
return false;
for (int i = 0; i < str.length(); i++)
if (charsList.get(off + i).charValue() != str.charAt(i))
return false;
return true;
}
static int[] findBoundariesСlosingTag(String tag, ArrayList<Character> charsList, int off) {
if (tag.length() < 1)
return null;
if (off < 0) off = 0;
if ((off + 3 + tag.length()) > charsList.size())
return null;
int end = charsList.size() - tag.length() - 2;
for (int i = off; i < end; i++)
if (charsList.get(i).charValue() == '<')
if (((i + 1) < charsList.size()) && (charsList.get(i + 1).charValue() == '/'))
if (isSubset(tag + ">", charsList, i + 2))
return new int[]{i, i + tag.length() + 3};
return null;
}
static int[] findBoundariesOpeningTag(String tag, ArrayList<Character> charsList, int off) {
if (tag.length() < 1)
return null;
if (off < 0) off = 0;
if ((off + 2 + tag.length()) > charsList.size())
return null;
int end = charsList.size() - tag.length() - 1;
int i;
for (i = off; i < end; i++)
if (charsList.get(i).charValue() == '<')
if (charsList.get(i + 1).charValue() != '/')
if (isSubset(tag, charsList, i + 1) && (
charsList.get(i + 1 + tag.length()).charValue() == ' ' ||
charsList.get(i + 1 + tag.length()).charValue() == '>' ||
charsList.get(i + 1 + tag.length()).charValue() == '\n' ||
charsList.get(i + 1 + tag.length()).charValue() == '\r'
))
break;
if (i >= end)
return null;
int j;
for (j = i + 1 + tag.length(); j < charsList.size(); j++)
if (charsList.get(j).charValue() == '>')
break;
if (j >= charsList.size()) return null;
return new int[]{i, j + 1};
}
}
а закончим тем что вот шаблон тега из условия задачи

Закончили или продолжаем?
МОИ тестовые данные сделаны в соответствии с заданием, но имеют мало общего с тестами задания. Тем не менее они сделаны согласно шаблона задания