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.
Related Topics:
String, Backtracking, Breadth-First Search
Similar Questions:
// OJ: https://leetcode.com/problems/brace-expansion/
// Author: github.com/lzl124631x
// Time: O(NK) where K is the total number of possible branches
// Space: O(N)
class Solution {
public:
vector<string> expand(string s) {
vector<vector<char>> v;
for (int i = 0, N = s.size(); i < N; ++i) {
if (s[i] == '{') {
++i;
v.emplace_back();
while (s[i] != '}') {
v.back().push_back(s[i++]);
if (s[i] == ',') ++i;
}
sort(begin(v.back()), end(v.back()));
} else v.push_back({ s[i] });
}
vector<string> ans;
string tmp;
function<void(int)> dfs = [&](int i) {
if (i == v.size()) {
ans.push_back(tmp);
return;
}
for (int j = 0; j < v[i].size(); ++j) {
tmp += v[i][j];
dfs(i + 1);
tmp.pop_back();
}
};
dfs(0);
return ans;
}
};