2
// To Get the value of index traversed in a recursive call.5
public List<String> braceExpansionII(String expression) {6
List<String> result = util(0, expression);7
Set<String> set = new TreeSet<>();9
return new ArrayList<>(set);12
List<String> util(int startIndex, String expression) {13
// This represents processed List in the current recursion.14
List<String> currentSet = new ArrayList<>();15
boolean isAdditive = false;16
String currentString = "";17
// This represents List that is being processed and not yet merged to currentSet.18
List<String> currentList = new ArrayList<>();20
for (int i = startIndex; i < expression.length(); ++i) {22
if (expression.charAt(i) == ',') {24
if (currentString != "" && currentList.size() == 0) {25
currentSet.add(currentString);26
} else if (currentList.size() > 0) {27
for (var entry : currentList) {28
currentSet.add(entry);33
currentList = new ArrayList<>();34
} else if (expression.charAt(i) >= 'a' && expression.charAt(i) <= 'z') {35
if (currentList.size() > 0) {36
List<String> tempStringList = new ArrayList<>();37
for (var entry : currentList) {38
tempStringList.add(entry + expression.charAt(i));40
currentList = tempStringList;42
currentString = currentString + expression.charAt(i);44
} else if (expression.charAt(i) == '{') {45
List<String> list = util(i + 1, expression);46
// System.out.println(list);47
// Need to merge the returned List. It could be one of the following.52
if (i > startIndex && expression.charAt(i - 1) == ',') {56
if (currentList.size() > 0) {57
List<String> tempList = new ArrayList<>();58
for (var entry1 : currentList) {59
for (var entry2 : list) {61
tempList.add(entry1 + currentString + entry2);65
// System.out.println(currentList);66
currentList = tempList;68
} else if (currentString != "") {69
List<String> tempList = new ArrayList<>();70
for (var entry : list) {72
tempList.add(currentString + entry);76
currentList = tempList;83
// Increment i to end of next recursion's processing.85
} else if (expression.charAt(i) == '}') {86
if (currentString != "") {87
currentSet.add(currentString);91
if (currentList.size() > 0) {92
for (var entry : currentList) {94
currentSet.add(entry + currentString);96
currentList = new ArrayList<>();100
return new ArrayList<>(currentSet);104
if (currentList.size() > 0) {106
currentSet.addAll(currentList);110
if (currentString != "") {112
List<String> tempSet = new ArrayList<>();113
if (currentSet.size() > 0) {114
for (var entry : currentSet) {115
tempSet.add(entry + currentString);118
currentSet = tempSet;120
currentSet = new ArrayList<>();121
currentSet.add(currentString);125
return new ArrayList<>(currentSet);