import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
{
String s
= "foo bar [first [second] [third]] asdf ]]]] [now [get] me [mor[e]] of this]]"; List<String> balanced = getBalancedSubstrings(s, '[', ']', true);
}
}
public static List
<String
> getBalancedSubstrings
(String s,
Character markStart,
{
List<String> subTreeList = new ArrayList<String>();
int level = 0;
int lastOpenDelimiter = -1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == markStart) {
level++;
if (level == 1) {
lastOpenDelimiter = (includeMarkers ? i : i + 1);
}
}
else if (c == markEnd) {
if (level == 1) {
subTreeList.add(s.substring(lastOpenDelimiter, (includeMarkers ? i + 1 : i)));
}
if (level > 0) level--;
}
}
return subTreeList;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBJZGVvbmUKewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJU3RyaW5nIHMgPSAiZm9vIGJhciBbZmlyc3QgW3NlY29uZF0gW3RoaXJkXV0gYXNkZiBdXV1dICBbbm93IFtnZXRdIG1lIFttb3JbZV1dIG9mIHRoaXNdXSI7CgkJTGlzdDxTdHJpbmc+IGJhbGFuY2VkID0gZ2V0QmFsYW5jZWRTdWJzdHJpbmdzKHMsICdbJywgJ10nLCB0cnVlKTsKCQlmb3IgKFN0cmluZyBzdHI6IGJhbGFuY2VkKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwoJCX0KCX0KCQoJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0QmFsYW5jZWRTdWJzdHJpbmdzKFN0cmluZyBzLCBDaGFyYWN0ZXIgbWFya1N0YXJ0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyIG1hcmtFbmQsIEJvb2xlYW4gaW5jbHVkZU1hcmtlcnMpIAoJewoJICAgICAgICBMaXN0PFN0cmluZz4gc3ViVHJlZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKCSAgICAgICAgaW50IGxldmVsID0gMDsKCSAgICAgICAgaW50IGxhc3RPcGVuRGVsaW1pdGVyID0gLTE7CgkgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CgkgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKCSAgICAgICAgICAgIGlmIChjID09IG1hcmtTdGFydCkgewoJICAgICAgICAgICAgICAgIGxldmVsKys7CgkgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgbGFzdE9wZW5EZWxpbWl0ZXIgPSAoaW5jbHVkZU1hcmtlcnMgPyBpIDogaSArIDEpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gbWFya0VuZCkgewoJICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAxKSB7CgkgICAgICAgICAgICAgICAgICAgIHN1YlRyZWVMaXN0LmFkZChzLnN1YnN0cmluZyhsYXN0T3BlbkRlbGltaXRlciwgKGluY2x1ZGVNYXJrZXJzID8gaSArIDEgOiBpKSkpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSBsZXZlbC0tOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBzdWJUcmVlTGlzdDsKCSAgICB9Cn0K