2020-5 leetcode 1096. 花括号展开 II

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());
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值