1.关键点:1.分析出什么是最小单位。
2.在最小单位中前面一个元素 乘以 { }中的 内
容怎么处理,{ }中的内容乘以后面一个元素怎么处理。以及两个操作的顺序。
3.重复的应用上述操作,对最单位进行处理得结果。
(对于递归解决问题,一定要弄清楚处理得最小单位是什么)
class Solution {
public:
void MUL(set<string>& s,string& t){
if(t.empty()) return ;
if(s.empty()){
s={t};
t.clear();
return ;
}
set<string> s1;
for(auto x:s){
s1.insert(x+t);
}
t.clear();
swap(s,s1);
}
void MUL(set<string>& res,const set<string>& s){
if(s.empty()) return;
if(res.empty()){
res=s;
return;
}
set<string> s1;
for(auto x:res){
for(auto y:s){
s1.insert(x+y);
}
}
swap(res,s1);
}
void ADD(set<string>& res,set<string> &s){
for(auto x:s){
res.insert(x);
}
s.clear();
}
set<string> backtrack(string exp1,int l,int r){
string t;
set<string> s,res;
for(int i=l;i<=r;){
if(exp1[i]==','){
MUL(s,t);
ADD(res,s);
}
else if(exp1[i]=='{'){
int l=i,count=1;
while(count>0&&++i<=r){
count+=exp1[i]=='{';
count-=exp1[i]=='}';
}
MUL(s,t);
MUL(s,backtrack(exp1,l+1,i-1));
}
else {
t+=exp1[i];
}
i++;
}
MUL(s,t);
ADD(res,s);
return res;
}
vector<string> braceExpansionII(string expression) {
auto s=backtrack(expression,0,expression.size()-1);
return vector<string>(s.begin(),s.end());
}
};