-
Notifications
You must be signed in to change notification settings - Fork 61
Expand file tree
/
Copy path1087-brace-expansion.js
More file actions
55 lines (48 loc) · 1.31 KB
/
1087-brace-expansion.js
File metadata and controls
55 lines (48 loc) · 1.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* 1087. Brace Expansion
* https://leetcode.com/problems/brace-expansion/
* Difficulty: Medium
*
* 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.
*/
/**
* @param {string} s
* @return {string[]}
*/
var expand = function(s) {
const groups = [];
let i = 0;
while (i < s.length) {
if (s[i] === '{') {
const start = i + 1;
while (s[i] !== '}') i++;
const options = s.substring(start, i).split(',');
groups.push(options);
i++;
} else {
groups.push([s[i]]);
i++;
}
}
const result = [];
backtrack(0, '');
return result.sort();
function backtrack(index, current) {
if (index === groups.length) {
result.push(current);
return;
}
for (const option of groups[index]) {
backtrack(index + 1, current + option);
}
}
};