No.275 - LeetCode[1096] Brace Expansion II - 复杂模拟题

写了两个小时,非常麻烦的一道模拟题。

关键在于,缓存字符串,和缓存数组嵌套判断,没有 case,这题过不了😂

/*
 * @lc app=leetcode id=1096 lang=cpp
 *
 * [1096] Brace Expansion II
 */

// @lc code=start


class Solution {
public:
    vector<string> duplicate(vector<vector<string>>& v){
        map<string, int> mp;
        vector<string> ans;
        for(int i=0;i<v.size();i++){
            for(int j=0;j<v[i].size();j++){
                if(mp[v[i][j]] == 0 ){
                    ans.push_back(v[i][j]);
                    mp[v[i][j]] = 1;
                }
            }
        }
        sort(ans.begin(), ans.end());
        return ans;
    }
    int findR(string& expression, int L) {
        int cnt = 0;
        for(int i=L;i<expression.size();i++){
            if(expression[i] == '{'){
                cnt ++ ;
                continue;
            }
            if(expression[i] == '}'){
                cnt -- ;
                if(cnt == 0){
                    return i;
                }
                continue;
            }
        }
        return -1;
    }
    vector<string> solve(string& expression, int L, int R){
        vector<vector<string>> ans; 
        vector<string> now;
        string str ;
        int i = L;
        while( i < R ){
            // 逗号
            if(expression[i] == ','){
                if(now.size() > 0){
                    for(int k=0;k<now.size();k++){
                        now[k] = now[k] + str;
                    }
                }else{
                    now.push_back(str);
                }
                ans.push_back(now);
                now = vector<string>{};
                str = "";
                i ++ ;
                continue;
            }
            // 左括号
            if(expression[i] == '{'){
                int j = findR(expression, i);
                vector<string> sub = solve(expression, i+1, j);
                if(now.size() > 0){
                    if(str != ""){
                        for(int k=0;k<now.size();k++){
                            now[k] = now[k] + str;
                        }
                    }
                    int a = now.size(), b = sub.size();
                    vector<string> tNow(a * b);
                    for(int x=0;x<a;x++){
                        for(int y=0;y<b;y++){
                            tNow[x*b + y] = now[x] + sub[y];
                        }
                    }    
                    now = tNow;
                }else{
                    now = sub;
                    if(str != ""){
                        for(int k=0;k<now.size();k++){
                            now[k] = str + now[k];
                        }
                    }
                }
                
                i = j + 1;
                str = "";
                continue;
            }
            // 字母
            str += expression[i++];
        }
        if(str != ""){
            if(now.size() > 0){
                for(int k=0;k<now.size();k++){
                    now[k] = now[k] + str;
                }
                ans.push_back(now);
                return duplicate(ans);
            }
            ans.push_back(vector<string>{str});
            return duplicate(ans);
        }
        if(now.size()>0){
            ans.push_back(now);
        }
        return duplicate(ans);
    }
    vector<string> braceExpansionII(string expression) {
        int N = expression.size();
        if(N <= 1){
            return vector<string>{expression};
        }
        return solve(expression, 0, N);
    }
};
// @lc code=end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值