题目描述:
Under a grammar given below, strings can represent a set of lowercase words. Let's use R(expr)
to denote the set of words the expression represents.
Grammar can best be understood through simple examples:
R("a") = {"a"}
R("w") = {"w"}
R("{a,b,c}") = {"a","b","c"}
R("{ {a,b},{b,c}}") = {"a","b","c"}
(notice the final set only contains each word at most once)R("{a,b}{c,d}") = {"ac","ad","bc","bd"}
R("a{b,c}{d,e}f{g,h}") = {"abdfg", "abdfh", "abefg", "abefh", "acdfg", "acdfh", "acefg", "acefh"}
Formally, the 3 rules for our grammar:
x
, we have R(x) = {x}
e_1, e_2, ... , e_k
with k >= 2
, we have R({e_1,e_2,...}) = R(e_1) ∪ R(e_2) ∪ ...
e_1
and e_2
, we have R(e_1 + e_2) = {a + b for (a, b) in R(e_1) × R(e_2)}
, where + denotes concatenation, and × denotes the cartesian product.Given an expression
representing a set of words under the given grammar, return the sorted list of words that the expression represents.
Example 1:
Input: "{a,b}{c,{d,e}}" Output: ["ac","ad","ae","bc","bd","be"]
Example 2:
Input: "{ {a,z},a{b,c},{ab,z}}" Output: ["a","ab","ac","z"] Explanation: Each distinct word is written only once in the final answer.
Constraints:
1 <= expression.length <= 60
expression[i]
consists of '{'
, '}'
, ','
or lowercase English letters.expression
represents a set of words based on the grammar given in the description.class Solution {
public:
vector braceExpansionII(string str) {
int i=0;
unordered_set result=parseRule1(str,i);
vector ret(result.begin(),result.end());
sort(ret.begin(),ret.end());
return ret;
}
private:
unordered_set merge(unordered_set&a, unordered_set&b){
if(a.size()==0) return b;
if(b.size()==0) return a;
unordered_set result;
for(auto& s1: a)
for(auto& s2: b) result.insert(s1+s2);
return result;
}
//{a,b},{c,d},有逗号分隔多个选项,当没有逗号分隔时就是单一选项
unordered_set parseRule1(const string& str, int& i){
unordered_set result;
result=parseRule2(str,i);
while(i tmp=parseRule2(str,i);
result.insert(tmp.begin(),tmp.end());
}
return result;
}
//a{c,d}b{e,f},没有逗号分隔,括号左右可能有字母,整个字符串就是一个选项
unordered_set parseRule2(const string& str, int& i){
unordered_set result;
while(i tmp=parseRule3(str, i);
result=merge(result,tmp);
}
else
{
unordered_set tmp;
string tmpStr;
while(i='a')
tmpStr.push_back(str[i++]);
tmp.insert(tmpStr);
result=merge(result,tmp);
}
}
return result;
}
//{a,b,c}, 括号把所有选项包含,左右没有其他字母,整个字符串就是一个选项
unordered_set parseRule3(const string& str, int& i){
unordered_set result;
i++; // 跳过左括号
result=parseRule1(str,i);
i++; // 跳过右括号
return result;
}
};