Leetcode 241.为运算表达式设计优先级

  比较常规的思路就是对于[l,i]、[i+1,r]两个区间的所有可能结果进行合并。考虑到expression.length <= 20,这样的想法是可以通过的。

int num[23],cnt;
int sign[23];   //sign[i]是num[i]后的符号

vector<int> dfs(int l,int r){
    vector<int> ans;
    if (l==r){
        ans.push_back(num[l]);
        return ans;
    }
    vector<int> a,b;
    for (int i=l;i<r;i++){ //分为[l,i]与[i+1,r]
        a=dfs(l,i);
        b=dfs(i+1,r);
        for (int j=0;j<a.size();j++){
            for (int k=0;k<b.size();k++){
                if (sign[i]==1)
                    ans.push_back(a[j]+b[k]);
                else if (sign[i]==2)
                    ans.push_back(a[j]-b[k]);
                else if (sign[i]==3)
                    ans.push_back(a[j]*b[k]);
            }
        }
    }
    return ans;
}

class Solution {
public:
    vector<int> diffWaysToCompute(string expression) {
        memset(num,0,sizeof(num));
        memset(sign,0,sizeof(sign));
        cnt=0;
        int lim=expression.size();
        expression+='&';    //防止读取越界
        for (int i=0;i<lim;i++){        //处理字符串
            if ('0'<=expression[i]&&expression[i]<='9'){
                if ('0'<=expression[i+1]&&expression[i+1]<='9')
                    num[cnt++]=10*(expression[i]-'0')+(expression[i+1]-'0'),i++;
                else
                    num[cnt++]=expression[i]-'0';
            }
            else if (expression[i]=='+')
                sign[cnt-1]=1;
            else if (expression[i]=='-')
                sign[cnt-1]=2;
            else if (expression[i]=='*')
                sign[cnt-1]=3;
        }
        cnt--;
        if (!cnt){
            vector<int> ans;
            ans.push_back(num[cnt]);
            return ans;
        }
        return dfs(0,cnt);
    }
};

 

 

posted @ 2022-07-01 11:33  wegret  阅读(22)  评论(0)    收藏  举报