1096. Brace Expansion II

括号题确实是很难写的,速度还是硬伤呀。各种小细节要讨论。

class Solution {
public:
    
    // merge vector<set<string>>
    set<string> mergeSets(vector<set<string>> inputs){
        set<string> results;
        for (int ii=0;ii<inputs.size();ii++){
            set<string> temp = inputs[ii];
            results.insert(temp.begin(), temp.end());
        }
        results.erase(",");
        return results;
    }
    
    // concat sets (has shunxu)
    set<string> concatSets(set<string> input1, set<string> input2){
        set<string> results;
        for (set<string>::iterator it1=input1.begin(); it1!=input1.end(); ++it1){
            for (set<string>::iterator it2=input2.begin(); it2!=input2.end(); ++it2){
                results.insert(*it1 + *it2);
            }
        }
        return results;
    }

    // judge set<string> is set(a) or not
    bool judgeSet(set<string> input){
        if (input.find("{")!=input.end()){
            return false;
        }
        if (input.find("}")!=input.end()){
            return false;
        }
        if (input.find(",")!=input.end()){
            return false;
        }
        return true;
    }
    
    // char 2 string
    string char2string(char a){
        string res = "";
        res += a;
        return res;
    }
    
    // print set
    void printset(set<string> input){
        for (std::set<string>::iterator it=input.begin(); it!=input.end(); ++it){
            cout << *it<<" ";
        }
        cout<<endl;
    }
    
    
    // main process
    vector<string> braceExpansionII(string expression) {
        
        std::stack<std::set<string>> mystack;
        for (int i=0;i<expression.size();i++){
            /*
            // valid stack top
            if (!mystack.empty()){
                printset(mystack.top());
            }*/
            
            // main process /
            if (expression[i]=='{' || expression[i]==','){
                set<string> temp;
                temp.insert(char2string(expression[i]));
                mystack.push(temp);
            }
            else if (expression[i]=='}'){
                
                // merge all sets
                vector<set<string>> allsets;
                while(!mystack.empty()){
                    set<string> top = mystack.top();
                    if (top.find("{")!=top.end()){ // find '{'
                        mystack.pop();
                        break;
                    }
                    allsets.push_back(mystack.top());
                    mystack.pop();
                }
                set<string> mergeset = mergeSets(allsets);
                
                // judge the top
                if (!mystack.empty()){
                    set<string> top = mystack.top();
                    if (judgeSet(top)){
                        set<string> result = concatSets(top, mergeset);
                        mystack.pop();
                        mystack.push(result);
                    }
                    else{
                        mystack.push(mergeset);   
                    }
                }
                else{
                    mystack.push(mergeset);
                }
            }
            else{ // a~z
                // set1
                string input = "";
                while(expression[i] >='a' && expression[i] <='z'){
                    input += expression[i];
                    i++;
                }
                i--;
                set<string> temp;
                temp.insert(input);
                
                // merge with top
                if (!mystack.empty() && judgeSet(mystack.top())){
                    set<string> result = concatSets(mystack.top(), temp);
                    mystack.pop();
                    mystack.push(result);
                }
                else{
                    mystack.push(temp);
                }
                
            }
        }
        
        // merge the left parts
        vector<set<string>> allsets;
        while(!mystack.empty()){
            allsets.push_back(mystack.top());
            mystack.pop();
        }
        set<string> result = mergeSets(allsets);
        
        // change set to vector
        vector<string> resultV;
        for (std::set<string>::iterator it=result.begin(); it!=result.end(); ++it){
            resultV.push_back(*it);
        }
        return resultV;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值