我们用一个特殊的字符串 S 来表示一份单词列表,之所以能展开成为一个列表,是因为这个字符串 S 中存在一个叫做「选项」的概念:
单词中的每个字母可能只有一个选项或存在多个备选项。
如果只有一个选项,那么该字母按原样表示。
如果存在多个选项,就会以花括号包裹来表示这些选项(使它们与其他字母分隔开),例如 "{a,b,c}"
表示 ["a", "b", "c"]
。
例子:"{a,b,c}d{e,f}"
可以表示单词列表 ["ade", "adf", "bde", "bdf", "cde", "cdf"]
。
请你按字典顺序,返回所有以这种方式形成的单词。
示例 1:
输入:"{a,b}c{d,e}f"
输出:["acdf","acef","bcdf","bcef"]
示例 2:
输入:"abcd"
输出:["abcd"]
提示:
1 <= S.length <= 50
你可以假设题目中不存在嵌套的花括号
在一对连续的花括号(开花括号与闭花括号)之间的所有字母都不会相同
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/brace-expansion 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
vector<string> ans;
public:
vector<string> expand(string S) {
vector<vector<char>> str;
vector<char> t;
int count = 0;
for(int i = 0; i < S.size(); ++i)
{
if(isalpha(S[i]))
t.push_back(S[i]);
else if(S[i] == '}' || (S[i] == '{' && !t.empty()))
{
if(S[i] == '}') count++;
sort(t.begin(), t.end());
str.push_back(t);
t.clear();
}
}
if(!t.empty())
{
sort(t.begin(), t.end());
str.push_back(t);
}
if(count == 0) return {S};//没有花括号,直接返回
dfs(str, "", 0);
return ans;
}
void dfs(vector<vector<char>>& str, string s, int i)
{
if(i == str.size())
{
ans.push_back(s);
return;
}
for(int j = 0; j < str[i].size(); ++j)
dfs(str, s+str[i][j], i+1);
}
};
8 ms 8.2 MB