# 1087. Brace Expansion

## Description

You are given a string s representing a list of words. Each letter in the word has one or more options.

• If there is one option, the letter is represented as is.
• If there is more than one option, then curly braces delimit the options. For example, "{a,b,c}" represents options ["a", "b", "c"].

For example, if s = "a{b,c}", the first character is always 'a', but the second character can be 'b' or 'c'. The original list is ["ab", "ac"].

Return all words that can be formed in this manner, sorted in lexicographical order.

Example 1:

Input: s = "{a,b}c{d,e}f"
Output: ["acdf","acef","bcdf","bcef"]


Example 2:

Input: s = "abcd"
Output: ["abcd"]


Constraints:

• 1 <= s.length <= 50
• s consists of curly brackets '{}', commas ',', and lowercase English letters.
• s is guaranteed to be a valid input.
• There are no nested curly brackets.
• All characters inside a pair of consecutive opening and ending curly brackets are different.

## Solutions

• class Solution {
private List<String> ans;
private List<String[]> items;

public String[] expand(String s) {
ans = new ArrayList<>();
items = new ArrayList<>();
convert(s);
dfs(0, new ArrayList<>());
Collections.sort(ans);
return ans.toArray(new String[0]);
}

private void convert(String s) {
if ("".equals(s)) {
return;
}
if (s.charAt(0) == '{') {
int j = s.indexOf("}");
convert(s.substring(j + 1));
} else {
int j = s.indexOf("{");
if (j != -1) {
convert(s.substring(j));
} else {
}
}
}

private void dfs(int i, List<String> t) {
if (i == items.size()) {
return;
}
for (String c : items.get(i)) {
dfs(i + 1, t);
t.remove(t.size() - 1);
}
}
}

• class Solution:
def expand(self, s: str) -> List[str]:
def convert(s):
if not s:
return
if s[0] == '{':
j = s.find('}')
items.append(s[1:j].split(','))
convert(s[j + 1 :])
else:
j = s.find('{')
if j != -1:
items.append(s[:j].split(','))
convert(s[j:])
else:
items.append(s.split(','))

def dfs(i, t):
if i == len(items):
ans.append(''.join(t))
return
for c in items[i]:
t.append(c)
dfs(i + 1, t)
t.pop()

items = []
convert(s)
ans = []
dfs(0, [])
ans.sort()
return ans