/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
String s
= "some text(text here(possible text)text(possible text(more text)))end text"; List<String> balanced = getBalancedSubstrings(s, '(', ')', true);
System.
out.
println("Balanced substrings:\n" + balanced
);
}
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)));
}
level--;
}
}
return subTreeList;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCVN0cmluZyBzID0gInNvbWUgdGV4dCh0ZXh0IGhlcmUocG9zc2libGUgdGV4dCl0ZXh0KHBvc3NpYmxlIHRleHQobW9yZSB0ZXh0KSkpZW5kIHRleHQiOwoJCUxpc3Q8U3RyaW5nPiBiYWxhbmNlZCA9IGdldEJhbGFuY2VkU3Vic3RyaW5ncyhzLCAnKCcsICcpJywgdHJ1ZSk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJCYWxhbmNlZCBzdWJzdHJpbmdzOlxuIiArIGJhbGFuY2VkKTsKCQkKCX0KCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEJhbGFuY2VkU3Vic3RyaW5ncyhTdHJpbmcgcywgQ2hhcmFjdGVyIG1hcmtTdGFydCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIgbWFya0VuZCwgQm9vbGVhbiBpbmNsdWRlTWFya2VycykgewoJICAgIExpc3Q8U3RyaW5nPiBzdWJUcmVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwoJICAgIGludCBsZXZlbCA9IDA7CgkgICAgaW50IGxhc3RPcGVuRGVsaW1pdGVyID0gLTE7CgkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKCSAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CgkgICAgICAgIGlmIChjID09IG1hcmtTdGFydCkgewoJICAgICAgICAgICAgbGV2ZWwrKzsKCSAgICAgICAgICAgIGlmIChsZXZlbCA9PSAxKSB7CgkgICAgICAgICAgICAgICAgbGFzdE9wZW5EZWxpbWl0ZXIgPSAoaW5jbHVkZU1hcmtlcnMgPyBpIDogaSArIDEpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIGVsc2UgaWYgKGMgPT0gbWFya0VuZCkgewoJICAgICAgICAgICAgaWYgKGxldmVsID09IDEpIHsKCSAgICAgICAgICAgICAgICBzdWJUcmVlTGlzdC5hZGQocy5zdWJzdHJpbmcobGFzdE9wZW5EZWxpbWl0ZXIsIChpbmNsdWRlTWFya2VycyA/IGkgKyAxIDogaSkpKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGxldmVsLS07CgkgICAgICAgIH0KCSAgICB9CgkgICAgcmV0dXJuIHN1YlRyZWVMaXN0OwoJfQp9